2009-10-23 17 views
7
create table jobs(
    id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, 
     ..... 
     salaryminus INTEGER UNSIGNED DEFAULT NULL, 
     salaryplus INTEGER UNSIGNED DEFAULT NULL, 
     ..... 
); 

tôi muốn làm một cái gì đó như:Cách đặt hàng tối đa hai cột có thể rỗng trong MySQL?

Select * from jobs order by maxof(salaryminus, salaryplus) limit 10; 

maxof(Null,1000) nên 1000,

Làm thế nào để thực hiện maxof?

Trả lời

12

Nếu bạn biết rằng salaryplus sẽ luôn luôn lớn hơn salaryminus, sau đó bạn có thể làm

order by coalesce(salaryplus, salaryminus, 0) 

coalesce sẽ trả về giá trị đầu tiên mà không phải là null, hoặc (trong ví dụ này) 0, nếu cả hai giá trị là vô giá trị.

Nếu không, làm một cái gì đó như thế này:

order by greatest(ifnull(salaryminus,0), ifnull(salaryplus,0)) 

này sẽ đối xử với cả hai salaryminussalaryplus là 0 nếu họ là null, và sẽ đặt hàng bằng càng lớn của cả hai.

+1

Lưu ý rằng 'GREATEST' không phải là SQL chuẩn. – Charles

+1

Nó không có trong tiêu chuẩn, nhưng được cung cấp bởi MySQL, cũng như PostgreSQL và Oracle. Nó được viết là "' MAX' "trong SQLite. Nếu bạn phải sử dụng SQL Server, hoặc cần phải viết SQL tiêu chuẩn cho một câu hỏi bài tập về nhà, hãy sử dụng "ORDER BY CASE WHERE salaryminus> salaryplus THEN salaryminus ELSE salaryplus END'" –

0

Bạn có thể sử dụng coalesce để chuyển các cột có thể thành giá trị cụ thể thay thế - ví dụ: coalesce(salaryminus, -99999999) sẽ cung cấp số âm lớn nếu salaryminus là rỗng, nhưng sẽ trả về lương nếu không có giá trị rỗng.

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