2011-01-27 34 views
11

Tôi đang cố gắng tính toán một trường và tôi muốn nó hoạt động khác nhau tùy thuộc vào việc một trong các cột có phải là rỗng hay không. Tôi đang sử dụng MySQLTrường hợp NOT NULL có điều kiện SQL

CASE 
    WHEN reply.replies <> NULL THEN 
    24/((UNIX_TIMESTAMP(NOW())-UNIX_TIMESTAMP(qcr.LAST_MOD_TIME)+3600)/3600)*(ces.EXPERT_SCORE+2.5*scs.SIMILARITY)*(EXP(-reply.replies)) 
    ELSE 1 
END as ANSWER_SCORE 

Đây có phải là cú pháp đúng không?

Trả lời

20

Bạn cần có when reply.replies IS NOT NULL

NULL là một trường hợp đặc biệt trong SQL và không thể so sánh với = hoặc <> nhà khai thác. IS NULL và IS NOT NULL được sử dụng thay thế.

+2

Chắc chắn nó có thể được so sánh sử dụng '=', '<' and '<>'. Kết quả của phép so sánh là 'NULL'. Đồng ý rằng logic boolean ba giá trị không dành cho tất cả mọi người, nhưng bạn không thể nói 'nó không thể được so sánh'. –

+0

trong khi điều này cho thấy làm thế nào để sử dụng CASE, mã trong câu hỏi thậm chí không cần một trường hợp – RichardTheKiwi

4
case when reply.replies IS NOT NULL ... 

Bạn không thể so sánh NULL với toán tử so sánh thông thường (số học). Mọi so sánh số học với NULL sẽ trả về NULL, ngay cả NULL = NULL hoặc NULL <> NULL sẽ mang lại NULL.

Sử dụng IS hoặc IS NOT để thay thế.

1

Bạn không cần tuyên bố trường hợp cho việc này.
Sử dụng IFNULL function

IFNULL(24/((UNIX_TIMESTAMP(NOW())-UNIX_TIMESTAMP(qcr.LAST_MOD_TIME)+3600)/3600) 
*(ces.EXPERT_SCORE+2.5*scs.SIMILARITY)*(EXP(-reply.replies)), 1) as ANSWER_SCORE 

Nếu reply.replies là null, khái niệm là phím tắt để NULL
IFNULL sau đó lấy tham số thứ 2 (1) và cho rằng kết quả là khi nó xảy ra.

Đối với các trường hợp khác mà bạn cần so sánh với NULL, this will help you để làm việc với MySQL.

0

Bạn có thể làm cho một tuyên bố trường hợp Kiểm tra Null

SELECT MAX(id+1), 
IF(MAX(id+1) IS NULL, 1, MAX(id+1)) 
AS id 
FROM `table_name`; 
Các vấn đề liên quan