2008-09-29 20 views
48

Tôi có một loạt các tác vụ trong cơ sở dữ liệu MySQL và một trong các trường là "ngày hết hạn". Không phải mọi công việc đều phải có ngày hết hạn.Có thể sử dụng SQL để sắp xếp theo ngày nhưng đặt ngày rỗng ở mặt sau của tập kết quả?

Tôi muốn sử dụng SQL để sắp xếp các tác vụ theo ngày hạn chót, nhưng đặt những ngày không có hạn chót ở mặt sau của tập kết quả. Vì nó là bây giờ, ngày null hiển thị đầu tiên, sau đó phần còn lại được sắp xếp theo ngày hạn chót sớm nhất mới nhất.

Bất kỳ ý tưởng nào về cách thực hiện điều này bằng SQL một mình? (Tôi có thể làm điều đó với PHP nếu cần, nhưng một giải pháp chỉ SQL sẽ là tuyệt vời.)

Cảm ơn!

Trả lời

62

Đây là giải pháp chỉ sử dụng SQL chuẩn, không phải ISNULL(). Hàm đó không phải là SQL tiêu chuẩn và có thể không hoạt động trên các thương hiệu RDBMS khác.

SELECT * FROM myTable 
WHERE ... 
ORDER BY CASE WHEN myDate IS NULL THEN 1 ELSE 0 END, myDate; 
+0

+1. Đây là một giải pháp tiêu chuẩn nhỏ gọn và thanh lịch khác (có sẵn từ [SQL: 2003 extension T611] (http://en.wikipedia.org/wiki/Order_by), mặc dù không phải tất cả các nhà cung cấp đều triển khai chức năng này): http://stackoverflow.com/ a) 12767777/814702. – informatik01

+1

@ informatik01, mẹo hay, nhưng câu hỏi này được gắn thẻ 'mysql' và MySQL không hỗ trợ cú pháp đó. –

+0

@BillKarwin Vâng, buồn. Chỉ kiểm tra điều này trên PostgreSQL 9.1, nơi nó hoạt động tốt. Dù sao, hãy để thông tin này được ở đây chỉ vì lợi ích của sự hoàn chỉnh. P.S. Chỉ cần nhận thấy rằng khi sử dụng 'ORDER BY' MySQL và PostgreSQL hành xử khác nhau: khi đặt hàng * tăng dần * MySQL đặt giá trị NULL ** đầu tiên **, trong khi PostgreSQL đặt giá trị NULL ** cuối **. Vâng, công cụ dành riêng cho nhà cung cấp ... – informatik01

4
SELECT foo, bar, due_date FROM tablename 
ORDER BY CASE ISNULL(due_date, 0) 
WHEN 0 THEN 1 ELSE 0 END, due_date 

Vì vậy, bạn có 2 đơn hàng theo mệnh đề. Việc đầu tiên đặt tất cả các giá trị không rỗng vào trước, sau đó sắp xếp theo ngày đến hạn sau đó

+0

"trường hợp isnull (due_date, 0) khi 0 thì 1 else 0" - tại sao lại làm tất cả những điều đó? isnull trả về 1 hoặc 0 anyway. – nickf

+0

Trong MSSQL, ISNULL trả về đối số đầu tiên của nó, hoặc đối số thứ hai của nó nếu đối số đầu tiên của nó là null. Có một hàm SQL tiêu chuẩn COALESCE thực hiện tương tự và cũng chấp nhận nhiều hơn hai đối số. Nhưng đây là một chút off-topic kể từ khi poster được hỏi về MySQL .... – Stewart

28
SELECT * FROM myTable 
WHERE ... 
ORDER BY ISNULL(myDate), myDate 
+0

ISNULL yêu cầu 2 đối số trên SQL Server. MySQL có yêu cầu một không? – Codewerks

+3

yep - chỉ một. http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#function_isnull – nickf

+0

Lưu ý rằng, trong trường hợp Access/VBA, 'True

Các vấn đề liên quan