PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak możesz rozwinąć skondensowany wiersz PostgreSQL na osobne kolumny?

9.3 i nowsze:zapytanie boczne

W PostgreSQL 9.3 lub nowszym użyj niejawnego zapytania bocznego:

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

Preferuj to sformułowanie dla wszystkich nowych zapytań . Powyższe to standardowe sformułowanie .

Działa również poprawnie z funkcjami, które RETURNS TABLE lub RETURNS SETOF RECORD jak również funcs z parametrami out, które RETURNS RECORD .

To skrót od:

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

Przed 9.3:rozszerzenie za pomocą symboli wieloznacznych (ostrożnie)

Wcześniejsze wersje, powodują wielokrotną ocenę some_function , czy nie działa, jeśli some_function zwraca zestaw, nie używaj tego :

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

Wcześniejsze wersje, unikają wielokrotnej oceny some_function przy użyciu drugiej warstwy pośredniej. Używaj tego tylko wtedy, gdy musisz obsługiwać całkiem stare wersje PostgreSQL.

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

Demo:

Konfiguracja:

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);

uruchomienie testowe:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zamiast LIKE i ~, dlaczego tylko SIMILAR TO działa podczas dopasowywania wyrażeń regularnych z alternatywami

  2. Pobieranie pliku z bytea w PostgreSQL za pomocą java

  3. Ta sama osoba o różnych zachowaniach

  4. Używanie dwufazowych zatwierdzeń na postgres

  5. Numery seryjne na grupę wierszy dla klucza złożonego