PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak przepisać instrukcję SELECT ... CROSS JOIN LATERAL ... dla starszych wersji PostgreSQL?

PostgreSQL obsługuje wywoływanie funkcji zwracających zestaw w SELECT klauzula. Jest to nieco przestarzałe, ponieważ mamy LATERAL i z pewnością jest odradzany, ponieważ zachowuje się raczej niekonsekwentnie, ale pozostaje użyteczny.

W twoim przypadku możesz napisać:

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

Może to jednak spowodować jedno wywołanie partition_into_months na kolumnę zwróconą, ponieważ (fn).* jest w zasadzie rozwinięty w makro do (fn).col1, (fn).col2, ... . Aby tego uniknąć, możesz umieścić go w podzapytaniu, np.

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

Zauważ, że dziwne wyniki zostaną napotkane w obecności wielu funkcji zwracających zestaw w SELECT lista. Nie jest to połączenie krzyżowe, jak można by się spodziewać. Na przykład porównaj:

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

do

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak nie wyświetlać hasła w postaci zwykłego tekstu podczas łączenia się z postgresem przez sqlalchemy, psycopg2?

  2. Rekurencyjne zapytanie Postgres z row_to_json

  3. Zapytanie do ORDER BY liczba wierszy zwróconych z innego SELECT

  4. lastInsertId nie działa w Postgresql

  5. Jak zaokrąglić średnią do 2 miejsc po przecinku w PostgreSQL?