sql >> Databáze >  >> RDS >> PostgreSQL

Jak můžete rozšířit zhuštěný řádek PostgreSQL do samostatných sloupců?

9.3 a vyšší:boční dotaz

V PostgreSQL 9.3 nebo novějším použijte implicitní laterální dotaz:

SELECT f.* FROM things t, some_function(t.thing_id) f;

Preferujte tuto formulaci pro všechny nové dotazy . Výše uvedené je standardní formulace .

Funguje také správně s funkcemi, které RETURNS TABLE nebo RETURNS SETOF RECORD stejně jako funkce s out-paramy, které RETURNS RECORD .

Je to zkratka pro:

SELECT f.*
FROM things t
CROSS JOIN LATERAL some_function(t.thing_id) f;

Před verzí 9.3:rozšíření zástupných znaků (s opatrností)

Předchozí verze způsobí vícenásobné vyhodnocení some_function , ne fungovat, pokud some_function vrátí sadu, toto nepoužívejte :

SELECT (some_function(thing_id)).* FROM things;

Předchozí verze, vyhýbá se vícenásobnému hodnocení some_function pomocí druhé vrstvy nepřímosti. Toto použijte pouze v případě, že musíte podporovat docela staré verze PostgreSQL.

SELECT (f).*
FROM (
  SELECT some_function(thing_id) f
  FROM things
) sub(f);

Ukázka:

Nastavení:

CREATE FUNCTION some_function(i IN integer, x OUT integer, y OUT text, z OUT text) RETURNS record LANGUAGE plpgsql AS $$
BEGIN
  RAISE NOTICE 'evaluated with %',i;
  x := i;
  y := i::text;
  z := 'dummy';
  RETURN;
END;
$$;

create table things(thing_id integer);
insert into things(thing_id) values (1),(2),(3);

zkušební provoz:

demo=>     SELECT f.* FROM things t, some_function(t.thing_id) f;
NOTICE:  evaluated with 1
NOTICE:  evaluated with 2
NOTICE:  evaluated with 3
 x | y |   z   
---+---+-------
 1 | 1 | dummy
 2 | 2 | dummy
 3 | 3 | dummy
(3 rows)

demo=>     SELECT (some_function(thing_id)).* FROM things;
NOTICE:  evaluated with 1
NOTICE:  evaluated with 1
NOTICE:  evaluated with 1
NOTICE:  evaluated with 2
NOTICE:  evaluated with 2
NOTICE:  evaluated with 2
NOTICE:  evaluated with 3
NOTICE:  evaluated with 3
NOTICE:  evaluated with 3
 x | y |   z   
---+---+-------
 1 | 1 | dummy
 2 | 2 | dummy
 3 | 3 | dummy
(3 rows)

demo=>  SELECT (f).*
    FROM (
      SELECT some_function(thing_id) f
      FROM things
    ) sub(f);
NOTICE:  evaluated with 1
NOTICE:  evaluated with 2
NOTICE:  evaluated with 3
 x | y |   z   
---+---+-------
 1 | 1 | dummy
 2 | 2 | dummy
 3 | 3 | dummy
(3 rows)


  1. Jak uložit pole do tabulky?

  2. Oracle Partition By Keyword

  3. Správný způsob, jak anotovat pole hodnocení pro sadu dotazů

  4. Rozsah dočasných tabulek v SQL Server