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'
và 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!