2011-01-27 31 views
11

フィールドを計算しようとしていますが、カラムのいずれかがnullになるかどうかによって、フィールドの動作が異なるようにします。私はMySQLを使用しています条件付きNOT NULLの場合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 

これは正しい構文ですか?あなたはwhen reply.replies IS NOT NULL

NULLを持っている必要があります

答えて

20

は、SQLで特別なケースで、=または<>演算子と比較することはできません。代わりにIS NULLとIS NOT NULLが使用されます。

+2

を確認するCASE文を確認することができます。比較の結果は「NULL」です。 3値のブール論理は誰にとっても同じではないということに同意しますが、「比較することはできません」と言うことはできません。 –

+0

これはCASEの使用方法を示していますが、問題のコードでも大文字小文字は必要ありません – RichardTheKiwi

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

NULLを通常の(算術)比較演算子と比較することはできません。 NULLとの算術比較はNULLを返します。NULL = NULLまたはNULL <> NULLでもNULLが返されます。

ISまたはIS NOTを代わりに使用してください。

1

このためのケースステートメントは必要ありません。
はreply.repliesがnullの場合、発現は
IFNULLをNULLにショートカットである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 

を使用し、次に2番目のパラメータ(1)を取り、それが起こる結果としてそれを与えます。

NULLを比較する必要がある他のケースでは、this will help youをMySQLで使用できます。

0

あなたはそれが `=`、 `<` and `<>を`使用して比較することができるヌル

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