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

Ưu tiên dựa trên thời gian trong Truy vấn Bản ghi Hoạt động

Không giống như một số cơ sở dữ liệu khác (như Oracle) PostgreSQL có boolean đầy đủ chức năng gõ phím. Bạn có thể sử dụng nó trực tiếp trong một ORDER BY mệnh đề mà không áp dụng CASE tuyên bố - đó là những điều tuyệt vời cho những tình huống phức tạp hơn.

Sắp xếp thứ tự cho boolean giá trị là:

FALSE -> TRUE -> NULL

Nếu bạn ORDER BY bool_expression DESC , bạn đảo ngược thứ tự thành:

NULL -> TRUE -> FALSE

Nếu bạn muốn TRUE đầu tiên và NULL cuối cùng, sử dụng NULLS LAST mệnh đề của ORDER BY :

ORDER BY (featured AND created_at > now() - interval '11 days') DESC NULLS LAST  
       , created_at DESC

Tất nhiên, NULLS LAST chỉ có liên quan nếu featured hoặc created_at can được NULL . Nếu các cột được xác định NOT NULL , vậy thì đừng bận tâm.

Ngoài ra, FALSE sẽ được sắp xếp trước NULL . Nếu bạn không muốn phân biệt giữa hai điều này, bạn quay lại CASE hoặc bạn có thể ném vào NULLIF() hoặc COALESCE() .

ORDER BY NULLIF(featured AND created_at > now() - interval '11 days'), FALSE)
                                                                DESC NULLS LAST
       , created_at DESC

Hiệu suất

Lưu ý, cách tôi đã sử dụng:

created_at > now() - interval '11 days'

không :

now() - created_at < interval '11 days'

Trong ví dụ đầu tiên, biểu thức bên phải là một hằng số được tính toán một lần . Sau đó, một chỉ mục có thể được sử dụng để tra cứu các hàng phù hợp. Rất hiệu quả.

Cái sau thường không thể được sử dụng với một chỉ mục. Giá trị phải được tính cho mọi hàng đơn lẻ, trước khi nó có thể được kiểm tra với biểu thức hằng ở bên phải. Đừng làm điều này nếu bạn có thể tránh nó. Đã từng!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Phương thức org.postgresql.jdbc4.Jdbc4Connection.isValid (int) chưa được triển khai

  2. Lệnh Postgresql COPY đưa ra lỗi bị từ chối Quyền

  3. PostgreSQL gan ruột:“Resjunk” là gì?

  4. Giữ cho PostgreSQL đôi khi chọn một kế hoạch truy vấn tồi

  5. Đặc quyền siêu người dùng mặc định của postgres bị xóa vô tình - tôi có thể lấy lại không?