Sắp xếp các giá trị NULL vào cuối bảng


95

Có cách nào với PostgreSQL để sắp xếp các hàng có NULLgiá trị trong các trường đến cuối bảng đã chọn không?

Giống:

SELECT * FROM table ORDER BY somevalue, PUT_NULL_TO_END

Câu trả lời:


171

Trước hết, các giá trị NULL được sắp xếp cuối cùng theo thứ tự tăng dần mặc định . Bạn không phải làm gì thêm.

Vấn đề áp dụng cho thứ tự giảm dần , là nghịch đảo hoàn hảo và do đó sắp xếp các giá trị NULL trước. Các giải pháp @Mosty ra nhọn đã được giới thiệu với PostgreSQL 8.3 :

ORDER BY somevalue DESC NULLS LAST

Đối với PostgreSQL 8.2 trở lên hoặc RDBMS khác không có tính năng SQL tiêu chuẩn này, bạn có thể thay thế:

ORDER BY (somevalue IS NULL), somevalue DESC

FALSEsắp xếp trước TRUE, vì vậy giá trị NULL đứng sau cùng, giống như trong ví dụ trên.

Câu trả lời sau có liên quan:


1
IMHO trong hầu hết các ứng dụng thế giới thực, bạn muốn các giá trị null cuối cùng theo thứ tự. Ví dụ: sắp xếp DESC trên dấu thời gian tùy chọn, tên, họ, ... vì vậy tôi thấy nó thực sự đáng ngờ mặc dù có vẻ hợp lý rằng thứ tự DESC về mặt toán học ngược lại với ASC. Có thể các null chỉ nằm trong một danh mục của riêng chúng và không bị ảnh hưởng bởi ASC, DESC và luôn đặt ở vị trí cuối cùng, đó sẽ là một mặc định tốt hơn.
Christophe Roussy

Nó có thể ảnh hưởng đến các chỉ mục nếu chúng là DESC, bạn cũng có thể thêm một ghi chú về điều đó? postgresql.org/message-id/…
Christophe Roussy

@ChristopheRoussy: Các chỉ mục khớp với thứ tự sắp xếp được chạm vào trong câu trả lời được liên kết ở trên.
Erwin Brandstetter

2
Cá nhân tôi nghĩ rằng mặc định nên ngược lại: NULL đứng đầu tiên theo thứ tự tăng dần và cuối cùng theo thứ tự giảm dần. Điều đó trực quan hơn nhiều, vì NULL là giá trị "nhỏ nhất".
Stephen

1
Đối với những người đến từ MYSQL, đây là một lol? Tại sao nó được xây dựng như thế này ngay từ đầu. HOẶC Mysql đã tối ưu hóa kết quả
CodeGuru

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.