PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Как да пренапиша оператор SELECT ... CROSS JOIN LATERAL ... за по-стари версии на PostgreSQL?

PostgreSQL поддържа извикване на функции за връщане на набор в SELECT клауза. Това донякъде е остаряло сега, когато имаме LATERAL и със сигурност се обезсърчава, защото има доста непостоянно поведение, но остава полезен.

Във вашия случай можете да напишете:

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

Това обаче може да доведе до едно извикване на partition_into_months за колона, върната, защото (fn).* е основно макро-разширено в (fn).col1, (fn).col2, ... . За да избегнете това, можете да го обвиете в подзаявка, напр.

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

Обърнете внимание, че ще се появят странни резултати при наличието на множество връщащи функции в SELECT списък. Това не е кръстосано свързване, както бихте очаквали. Например сравнете:

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

до

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. SQL отделни множество колони

  2. Преобразуване на връзка "много към много" в "един към много" в PostgreSQL

  3. Търся телефонен номер, съдържащ минус, като 123-456789

  4. Как да получите играч с максимален резултат от всяка група с помощта на SQL?

  5. Големите обекти не могат да се използват в режим на автоматично записване