1

与えられた:

次のSelectステートメント:

select case NULL
       when NULL then 0
       else 1
       end

問題:

これが0を返すことを期待していますが、代わりに1を返します。

4

5 に答える 5

9

一般的に言って、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では機能しません。

于 2011-08-31T16:45:11.847 に答える
4

これをアーロンの回答にコメントとして追加するつもりでしたが、時間がかかりすぎたので、別の(一部の)回答として追加します。

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

しかし、それが常に優れた選択肢であるとは限りません。

于 2011-08-31T21:13:42.017 に答える
3

他の回答に加えて、CASEこれを行うには構文を少し変更する必要があります。

SELECT CASE 
    WHEN NULL IS NULL THEN 0
    ELSE 1
    END;

構文で値を使用すると、暗黙的に等しい比較が使用されます。NULLは不明であり、そうでNULL = NULLあるため、現在のコードでは常にゼロ1になります(そうですね、私もそうしました)。

必要な動作を得るには、 SETANSI_NULLSON ;を使用できます。ただし、これにより、予測できない方法で他のコードが変更される可能性があり、設定が非推奨になることに注意してください。そのため、SQL Serverの将来のバージョンではまったく機能しなくなります(このSQL Server 2008のドキュメントを参照)。

于 2011-08-31T17:06:32.637 に答える
0

ISNULL演算子を使用する必要があります。標準の比較演算子はNULLでは機能しません。

于 2011-08-31T16:45:33.593 に答える
0

役立つ可能性のあるNullに関する次のMSDN記事を確認してください。

于 2011-08-31T16:46:42.397 に答える