sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Cómo reescribir una declaración SELECT ... CROSS JOIN LATERAL ... para versiones anteriores de PostgreSQL?

PostgreSQL admite llamadas a funciones de devolución de conjuntos en SELECT cláusula. Esto está algo obsoleto ahora que tenemos LATERAL y ciertamente se desaconseja porque tiene un comportamiento bastante errático, pero sigue siendo útil.

En tu caso podrías escribir:

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

Sin embargo, esto puede resultar en una llamada a partition_into_months por columna devuelta porque (fn).* es básicamente macro-expandido en (fn).col1, (fn).col2, ... . Para evitar esto, puede envolverlo en una subconsulta, por ejemplo,

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

Tenga en cuenta que se encontrarán resultados extraños en presencia de múltiples funciones de devolución de conjuntos en el SELECT lista. No es una combinación cruzada como cabría esperar. Por ejemplo, compare:

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

a

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