PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come riscrivere un'istruzione SELECT ... CROSS JOIN LATERAL ... per versioni precedenti di PostgreSQL?

PostgreSQL supporta la chiamata di funzioni di restituzione di set in SELECT clausola. Questo è in qualche modo deprecato ora che abbiamo LATERAL ed è certamente sconsigliato perché ha un comportamento piuttosto irregolare, ma resta utile.

Nel tuo caso potresti scrivere:

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

Tuttavia, ciò potrebbe comportare una chiamata a partition_into_months per colonna restituita perché (fn).* è sostanzialmente ampliato in macro in (fn).col1, (fn).col2, ... . Per evitare ciò, puoi racchiuderlo in una sottoquery, ad es.

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

Nota che si incontreranno strani risultati in presenza di più funzioni di ritorno di set in SELECT elenco. Non è un cross-join come ti aspetteresti. Ad esempio, confronta:

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

a

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