sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur man skriver om ett SELECT ... CROSS JOIN LATERAL ... uttalande för äldre PostgreSQL-versioner?

PostgreSQL stöder anrop av set-returing-funktioner i SELECT klausul. Detta är något förlegat nu när vi har LATERAL och är förvisso avskräckt eftersom den har ett ganska oregelbundet beteende, men det förblir användbart.

I ditt fall kan du skriva:

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

Detta kan dock resultera i ett anrop till partition_into_months per kolumn returneras eftersom (fn).* är i princip makroexpanderat till (fn).col1, (fn).col2, ... . För att undvika detta kan du slå in den i en underfråga, t.ex.

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

Observera att konstiga resultat kommer att påträffas i närvaro av flera uppsättningsreturfunktioner i SELECT lista. Det är inte en korskoppling som du förväntar dig. Jämför till exempel:

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

till

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



  1. Gå med till vänster eller välj från flera tabeller med kommatecken (,)

  2. Vill skapa serienummer

  3. Hur använder man en tabelltyp i en SELECT FROM-sats?

  4. lagrad procedur för att välja alla rader från tabellen i Oracle