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

Hvordan omskriver man en SELECT ... CROSS JOIN LATERAL ... erklæring for ældre PostgreSQL-versioner?

PostgreSQL understøtter kaldende af sæt-returnerende funktioner i SELECT klausul. Dette er noget forældet nu, hvor vi har LATERAL og er bestemt afskrækket, fordi den har en ret uregelmæssig adfærd, men den forbliver nyttig.

I dit tilfælde kunne du skrive:

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

Dette kan dog resultere i et kald til partition_into_months kolonne returneret fordi (fn).* er grundlæggende makroudvidet til (fn).col1, (fn).col2, ... . For at undgå dette kan du pakke det ind i en underforespørgsel, f.eks.

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

Bemærk, at mærkelige resultater vil blive stødt på, hvis der er flere sæt returnerende funktioner i SELECT liste. Det er ikke en krydsforbindelse, som du ville forvente. Sammenlign f.eks.:

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

til

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



  1. Hvordan sender man en streng med ' ' (tidsstempel) i forberedt erklæring?

  2. Sådan skjules mysql-lagrede procedure

  3. Geo Django mac OS X

  4. Django-objektskabelse og Postgres-sekvenser