2

SQL で select ステートメントを作成していますが、case ステートメントまたは if else ステートメントを含む where 句を作成しようとして問題が発生しています。変数の値に基づいてレコードを選択したいと考えています。変数が「True」の場合、列が null である select ステートメントからのレコードのみが返されます。変数が「True」でない場合、その列が null であるかどうかにかかわらず、すべてのレコードを返します。

これを行う方法に関するヒントはありますか?

以下は、私がやろうとしていることの簡単な例です:

declare @option1 as varchar(5)

--This can be True or False so to test i just put the Set option below
set @option1 = 'True'

Select a,b,c,d...
from ...
where d = case when @option1 = 'True' then NULL End

これは私が何をすべきかわからない部分です。変数が「True」の場合にのみレコードを除外する必要があるため、ケースのelseセクションに何を入れればよいかわかりません。

4

2 に答える 2

9

NULL は NULL と等しくないため(ANSI_NULLS を「オフ」に設定しない限り) d = NULL、常に false を返すため、CASE ステートメントのようにテストすることはできません。

最も簡単な方法は、WHERE 句を次のように変更することです。

WHERE @option1 = 'False' OR d IS NULL

何らかの理由で CASE ステートメントを使用する場合は、次のように記述できます。

WHERE 1 = CASE WHEN @option1 = 'False' THEN 1 
               WHEN @option1 = 'True' AND d IS NULL THEN 1 
               ELSE 0 
          END
于 2012-12-19T00:01:02.877 に答える
1

これ:

更新:PinnyMはこれについて私をまっすぐにしました。私は大衆の教育のためにここに私の恥ずかしい論理的に欠陥のある議論を残しています。「これを試してみてください」の後に私が提案する解決策は確かにまだ有効ですが、PinnyMの解決策ははるかにエレガントであり、使用する必要があります。

WHERE @ option1 ='False' OR d IS NULL

現在のselectステートメントを指定すると、常にすべての結果が返されます(@ Option1が単に渡されたフラグパラメーターであると想定)。

これを試して:

SELECT a, b, c, d
WHERE 
    -- Returns only rows where d is null (if @Option1 is True)
    (@Option1 = 'True' AND d IS NULL) 
    OR
     -- returns all the rows (if @Option1 is False)
    (@Option1 = 'False')
于 2012-12-19T02:01:45.650 に答える