PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie schreibe ich eine SELECT ... CROSS JOIN LATERAL ... -Anweisung für ältere PostgreSQL-Versionen um?

PostgreSQL unterstützt den Aufruf von Set-Returning-Funktionen im SELECT Klausel. Dies ist jetzt, da wir LATERAL haben, etwas veraltet und wird sicherlich entmutigt, weil es ein ziemlich unberechenbares Verhalten hat, aber es bleibt nützlich.

In Ihrem Fall könnten Sie schreiben:

SELECT 
  i.*,
  (partition_into_months(i.start_date, i.stop_or_current_date)).*
FROM invoicable_interval i;

Dies kann jedoch zu einem Aufruf von partition_into_months führen pro zurückgegebener Spalte, weil (fn).* ist im Grunde Makro-erweitert in (fn).col1, (fn).col2, ... . Um dies zu vermeiden, können Sie es in eine Unterabfrage einschließen, z. B.

SELECT (x.i).*, (x.p).*
FROM
(
  SELECT 
    i,
    partition_into_months(i.start_date, i.stop_or_current_date) p
  FROM invoicable_interval i
) x(i,p);

Beachten Sie, dass seltsame Ergebnisse auftreten, wenn mehrere Set-Rückgabefunktionen in SELECT vorhanden sind aufführen. Es ist kein Cross-Join, wie Sie es erwarten würden. Vergleichen Sie zum Beispiel:

SELECT generate_series(1,4), generate_series(1,4)

zu

SELECT generate_series(1,4), generate_series(1,3);