PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como reescrever uma instrução SELECT ... CROSS JOIN LATERAL ... para versões mais antigas do PostgreSQL?


O PostgreSQL suporta a chamada de funções de retorno de conjunto no SELECT cláusula. Isso está um pouco obsoleto agora que temos LATERAL e é certamente desencorajado porque tem um comportamento bastante errático, mas continua útil.

No seu caso, você poderia escrever:
SELECT 
  i.*,
  (partition_into_months(i.start_date, i.stop_or_current_date)).*
FROM invoicable_interval i;

No entanto, isso pode resultar em uma chamada para partition_into_months por coluna retornada porque (fn).* é basicamente macro-expandido em (fn).col1, (fn).col2, ... . Para evitar isso, você pode envolvê-lo em uma subconsulta, por exemplo
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);

Observe que resultados estranhos serão encontrados na presença de várias funções de retorno definidas no SELECT Lista. Não é uma junção cruzada como você esperaria. Por exemplo, compare:
SELECT generate_series(1,4), generate_series(1,4)

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