0

私はかなり単純であるべきことをしようとしていますが、ISNULL は私が思っていたことをしていません。

基本的にストアド プロシージャがあり、PARAM1 または PARAM2 のいずれかがテーブルに一致する値を持つことを期待しています。

SELECT * FROM MyTable WITH (NOLOCK)
        WHERE      
        field1 = ISNULL(@PARAM1 ,field1 )
        AND        
        field2 = @PARAM2

これは、行に NULL フィールドがあるまでは正常に機能し、それらの結果は除外されます。これに対応できる別の方法はありますか?

4

3 に答える 3

2

ISNULL は最初の値を 2 番目の値に置き換えるため、パラメーター @PARAM1 が NULL の場合にのみ、PARAM1 に置き換えられます。私はあなたが NULL 値を渡していないと仮定しているので、それはおそらくあなたが望むものではありません. 言いたいだけの可能性が高い

WHERE
(Field1 = @PARAM1 OR Field1 IS NULL)
AND
Field2 = @Param2

この方法でも ISNULL を使用できると思います。

ISNULL(Field1, @PARAM1) = @PARAM1
于 2011-05-12T15:05:12.643 に答える
1

使用する

field1 = ISNULL(@PARAM1, A_REPLACEMENT_VALUE_IF_PARAM1_IS_NULL)

これは次のように評価されます-

field1 = @PARAM1 (@PARAM1 が NULL でない場合)。

field1 = A_REPLACEMENT_VALUE_IF_PARAM1_IS_NULL @PARAM1 IS NULLの場合

編集:

これらを試してください:

--If you want to ignore the WHERE clause if PARAM1/2 is null
ISNULL(field1, DEFAULT_VALUE) = ISNULL(@PARAM1, ISNULL(field1, DEFAULT_VALUE))
OR
ISNULL(field2, DEFAULT_VALUE) = ISNULL(@PARAM2, ISNULL(field2, DEFAULT_VALUE))

また

--To get all rows with field1/2 as PARAM1/2 and ignore everything else
field1 = @PARAM1 OR field2 = @PARAM2
于 2011-05-12T15:07:05.617 に答える
1

null は sql では特別です。列で比較を行うと、その列が null の行は除外されます。

SELECT * FROM MyTable WITH (NOLOCK)
        WHERE      
        (PARAM1 = @PARAM1 or PARAM1 is null)
        AND        
        (PARAM2 = @PARAM2 or PARAM2 is null)
于 2011-05-12T15:11:18.440 に答える