2011-01-27 59 views
11

我想計算一個字段,並且我希望它的行爲有所不同,具體取決於其中一列是否爲空。我正在使用MySQL有條件的非空案例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 

這是正確的語法嗎?

回答

20

你需要有when reply.replies IS NOT NULL

NULL是SQL的一個特例,不能用=或<>運營商進行比較。替代地使用IS NULL和IS NOT NULL。

+2

當然也可以使用'=',''<' and '<>進行比較。比較的結果是'NULL'。同意三值布爾邏輯不適合每個人,但你不能說'不能比較'。 –

+0

雖然這顯示瞭如何使用CASE,但有問題的代碼甚至不需要一個case – RichardTheKiwi

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

您無法將NULL與常規(算術)比較運算符進行比較。任何與NULL的算術比較都會返回NULL,即使NULL = NULLNULL <> NULL也會返回NULL。而不是使用ISIS NOT

1

您不需要case語句。
使用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 

如果reply.replies爲空,則表達式是快捷方式爲NULL
IFNULL然後開出第二參數(1),並給出作爲結果,當它發生。

對於其他需要與NULL進行比較的情況,使用this will help you來處理MySQL。

0

你可以做一個CASE語句中檢查空

SELECT MAX(id+1), 
IF(MAX(id+1) IS NULL, 1, MAX(id+1)) 
AS id 
FROM `table_name`;