PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Làm cách nào để viết lại câu lệnh SELECT ... CROSS JOIN LATERAL ... cho các phiên bản PostgreSQL cũ hơn?

PostgreSQL hỗ trợ gọi các hàm set-return trong SELECT mệnh đề. Điều này có phần không được chấp nhận nữa vì chúng ta có LATERAL và chắc chắn không được khuyến khích vì nó có hành vi khá thất thường, nhưng nó vẫn hữu ích.

Trong trường hợp của bạn, bạn có thể viết:

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

Tuy nhiên, điều này có thể dẫn đến một cuộc gọi đến partition_into_months mỗi cột được trả về vì (fn).* về cơ bản được mở rộng macro thành (fn).col1, (fn).col2, ... . Để tránh điều này, bạn có thể bọc nó trong một truy vấn con, ví dụ:

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

Lưu ý rằng sẽ gặp phải các kết quả kỳ lạ khi có nhiều hàm trả về được đặt trong SELECT danh sách. Nó không phải là một tham gia chéo như bạn mong đợi. Ví dụ:so sánh:

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

đến

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. di chuyển từ sqlite sang postgresql ở django

  2. Django:Các phương pháp hay nhất để chuyển một dự án từ sqlite sang PostgreSQL là gì

  3. Chọn tổng và số dư đang hoạt động trong 18 tháng qua với create_series

  4. Liệt kê các phân vùng bảng trong bảng Postgres

  5. Ưu và nhược điểm của việc thực hiện các phép tính trong sql so với trong ứng dụng của bạn là gì