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

Hành vi mong đợi cho nhiều hàm trả về trong mệnh đề SELECT là gì?

Postgres 10 hoặc mới hơn

thêm giá trị null cho (các) tập hợp nhỏ hơn. Demo với generate_series() :

SELECT generate_series( 1,  2) AS row2
     , generate_series(11, 13) AS row3
     , generate_series(21, 24) AS row4;
row2 | row3 | row4
-----+------+-----
   1 |   11 |   21
   2 |   12 |   22
null |   13 |   23
null | null |   24

dbfiddle tại đây

Hướng dẫn cho Postgres 10 :

Nếu có nhiều hơn một hàm trả về bộ trong danh sách chọn của truy vấn, hành vi tương tự như những gì bạn nhận được khi đặt các hàm vào một LATERAL ROWS FROM( ... ) FROM -cản mục. Bỏ qua hàng từ truy vấn bên dưới, có một hàng đầu ra sử dụng kết quả đầu tiên từ mỗi hàm, sau đó là một hàng đầu ra sử dụng kết quả thứ hai, v.v. Nếu một số hàm set-return tạo ra kết quả đầu ra của người dùng hơn những hàm khác, thì giá trị null sẽ được thay thế cho dữ liệu bị thiếu, sao cho tổng số hàng được phát ra cho một hàng cơ bản giống như đối với hàm set-return tạo ra nhiều đầu ra nhất. Do đó, các hàm trả về thiết lập chạy “trong bước khóa” cho đến khi chúng hoạt động hết và sau đó việc thực thi tiếp tục với hàng bên dưới.

Điều này chấm dứt hành vi kỳ quặc truyền thống.

Postgres 9.6 trở lên

Số hàng kết quả (hơi ngạc nhiên!) Là bội số chung thấp nhất của tất cả các bộ trong cùng một SELECT danh sách. (Chỉ hoạt động giống như một CROSS JOIN nếu không có ước số chung cho tất cả các kích thước đã đặt!) Demo:

SELECT generate_series( 1,  2) AS row2
     , generate_series(11, 13) AS row3
     , generate_series(21, 24) AS row4;
row2 | row3 | row4
-----+------+-----
   1 |   11 |   21
   2 |   12 |   22
   1 |   13 |   23
   2 |   11 |   24
   1 |   12 |   21
   2 |   13 |   22
   1 |   11 |   23
   2 |   12 |   24
   1 |   13 |   21
   2 |   11 |   22
   1 |   12 |   23
   2 |   13 |   24

dbfiddle tại đây

Được lập thành tài liệu hướng dẫn cho Postgres 9.6 chương Bộ trả về hàm SQL , cùng với khuyến cáo nên tránh:

Lưu ý:Vấn đề quan trọng với việc sử dụng các hàm trả về thiết lập trong danh sách chọn, thay vì FROM , là việc đặt nhiều hơn hàm trả về một tập hợp trong cùng một danh sách lựa chọn không hoạt động rõ ràng. ( Những gì bạn thực sự nhận được nếu làm như vậy là một số mũi tên xuất ra bằng bội số chung nhỏ nhất của số hàng được tạo ra bởi mỗi hàm trả về bộ. ) LATERAL cú pháp không tạo ra kết quả đáng ngạc nhiên khi gọi nhiều hàm set-return và thường nên được sử dụng để thay thế.

Nhấn mạnh đậm của tôi.

Một chức năng trả về bộ duy nhất là OK (nhưng vẫn rõ ràng hơn trong FROM danh sách), nhưng nhiều trong cùng một SELECT danh sách không được khuyến khích ngay bây giờ. Đây là một tính năng hữu ích trước khi chúng tôi có LATERAL tham gia. Bây giờ nó chỉ đơn thuần là chấn lưu lịch sử.

Có liên quan:

  • Song song unnest () và thứ tự sắp xếp trong PostgreSQL
  • Bỏ kết hợp nhiều mảng song song
  • Sự khác biệt giữa LATERAL JOIN và một truy vấn con trong PostgreSQL là gì?


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Đếm số lần xuất hiện của một chuỗi con trong một chuỗi trong PostgreSQL

  2. Làm cách nào để khởi động máy chủ PostgreSQL trên Mac OS X?

  3. Nâng cấp lên PostgreSQL13

  4. SQL:Khi nói đến NOT IN và NOT EQUAL TO, cái nào hiệu quả hơn và tại sao?

  5. Có cách nào để tắt cập nhật / xóa nhưng vẫn cho phép trình kích hoạt thực hiện chúng không?