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

Wielokrotne wywołanie funkcji zwracającej zestaw z argumentem tablicowym

W Postgresie 9.3 lub nowszym zazwyczaj najlepiej jest użyć LEFT JOIN LATERAL ... ON true :

SELECT sub.dataid, f.*
FROM  (
   SELECT dataid, array_agg(data) AS arr
   FROM   dataset
   WHERE  dataid = something
   GROUP  BY 1
   ) sub
LEFT   JOIN LATERAL foo(sub.arr) f ON true;

Jeśli funkcja foo() może zwrócić brak wierszy , jest to bezpieczna forma, ponieważ zachowuje wszystkie wiersze na lewo od złączenia, nawet jeśli żaden wiersz nie jest zwracany po prawej stronie.

Inaczej lub jeśli chcesz aby wykluczyć wiersze bez wyniku z łączenia bocznego, użyj:

CROSS JOIN LATERAL foo(sub.arr)

lub skrót:

, foo(sub.arr)

W instrukcji znajduje się wyraźna wzmianka.

Powiązana odpowiedź Craiga (do której odwołuje się Daniel) została odpowiednio zaktualizowana:

  • Jak uniknąć wielu ewaluacji funkcji za pomocą składni (func()).* w zapytaniu SQL?


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak działa justify_days() w PostgreSQL

  2. jak poprzedzić ciąg przed sekwencją wygenerowaną przez postgresql?

  3. Jak przekonwertować datę i godzinę na wartość epoki uniksowej w Postgresie?

  4. Jaka jest różnica między `->>` a `->` w Postgres SQL?

  5. Sparametryzowana PostgreSQL funkcja Order By / Limit w tabeli