PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment réécrire une instruction SELECT ... CROSS JOIN LATERAL ... pour les anciennes versions de PostgreSQL ?

PostgreSQL prend en charge l'appel des fonctions de retour d'ensemble dans le SELECT clause. Ceci est quelque peu obsolète maintenant que nous avons LATERAL et est certes déconseillé car il a un comportement plutôt erratique, mais il reste utile.

Dans votre cas, vous pourriez écrire :

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

Cependant, cela peut entraîner un appel à partition_into_months par colonne renvoyée car (fn).* est essentiellement macro-développé en (fn).col1, (fn).col2, ... . Pour éviter cela, vous pouvez l'envelopper dans une sous-requête, par exemple

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

Notez que des résultats étranges seront rencontrés en présence de plusieurs fonctions de retour d'ensemble dans le SELECT liste. Ce n'est pas une jointure croisée comme on pourrait s'y attendre. Par exemple, comparez :

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

à

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