与えられた:
次のSelectステートメント:
select case NULL
when NULL then 0
else 1
end
問題:
これが0を返すことを期待していますが、代わりに1を返します。
与えられた:
次のSelectステートメント:
select case NULL
when NULL then 0
else 1
end
問題:
これが0を返すことを期待していますが、代わりに1を返します。
一般的に言って、NULLは、等しいかどうかを比較しようとするべきものではありません。これは、caseステートメントが行うことです。「IsNULL」を使用してテストできます。NULL != NULL
それやあれの期待はありませんNULL = NULL
。これは不確定で未定義の値であり、厳密な定数ではありません。
-コメントに質問を含めるために-
NULL列が発生する可能性があるときに値を取得する必要がある場合は、代わりにこれを試してください。
Case
When SomeColumn IS NULL
Then 0
Else 1
End
私はそれがうまくいくはずだと信じています。元の投稿に関する限り:
Select Case NULL
When NULL then 0 // Checks for NULL = NULL
else 1 // NULL = NULL is not true (technically, undefined), else happens
end
問題は、Caseselectが自動的に等式演算を使用しようとすることです。それは単にNULLでは機能しません。
これをアーロンの回答にコメントとして追加するつもりでしたが、時間がかかりすぎたので、別の(一部の)回答として追加します。
CASE
ステートメントには、実際には、単純モードと検索モードの2つの異なるモードがあります。
BOLから:
CASE式には、次の2つの形式があります。
単純なCASE式は、式を一連の単純な式と比較して、結果を判別します。
検索されたCASE式は、ブール式のセットを評価して結果を決定します。
単純なCASE
(あなたの例)が比較として説明することを行うとき、それは等式比較を行います-すなわち=
これは、後のドキュメントで明確にされています。
単純なCASE式は、最初の式を各WHEN句の式と同等であるかどうかを比較することによって機能します。これらの式が同等である場合、THEN句の式が返されます。
- 同等性チェックのみを許可します。
ANSI SQLでは常にfalseであるためanything = NULL
(これを知らなかった場合は、SQLのNULLをより一般的に読み取る必要があります。特に、他の検索された比較の動作についても同様です- WHERE x IN (a, b, c)
)、単純なケースでは使用できません。初期式または比較対象の式のリストのいずれかを使用しNULL
て、値と比較したことがありますか。NULL
を確認する場合は、構成NULL
を使用するIF/ELSE
か、完全な式で検索CASE
する必要があります。
書きやすくするためにIS比較をサポートするバージョンがないのは残念なことです。
select case colname
when IS NULL then 0
else 1
end
これにより、特定の長いCASE
ステートメントを簡単に作成できます。
select case colname
when IS NULL then ''
when 1 then 'a'
when 2 then 'b'
when 3 then 'c'
when 4 then 'd'
else 'z'
end
しかし、それは希望的観測です...
オプションは、ISNULL
またはを使用することCOALESCE
です:
select case COALESCE(colname, 999999) -- 999999 is some value never used
when 999999 then ''
when 1 then 'a'
when 2 then 'b'
when 3 then 'c'
when 4 then 'd'
else 'z'
end
しかし、それが常に優れた選択肢であるとは限りません。
他の回答に加えて、CASE
これを行うには構文を少し変更する必要があります。
SELECT CASE
WHEN NULL IS NULL THEN 0
ELSE 1
END;
構文で値を使用すると、暗黙的に等しい比較が使用されます。NULL
は不明であり、そうでNULL = NULL
あるため、現在のコードでは常にゼロ1になります(そうですね、私もそうしました)。
必要な動作を得るには、 SETANSI_NULLSON ;を使用できます。ただし、これにより、予測できない方法で他のコードが変更される可能性があり、設定が非推奨になることに注意してください。そのため、SQL Serverの将来のバージョンではまったく機能しなくなります(このSQL Server 2008のドキュメントを参照)。
ISNULL演算子を使用する必要があります。標準の比較演算子はNULLでは機能しません。
役立つ可能性のあるNullに関する次のMSDN記事を確認してください。