2009-05-01 17 views
27

SQL Server 2000には、パラメータ値に基づいて検索を実行するストアドプロシージャがあります。渡されたパラメータの1つに、私は、その値に応じて異なるWHERE句を必要とする - の問題は3つの値がどこMyColumnWHERE句はNULLですか、SQL Serverパラメータの値に応じてWHERE句はありません。

  1. IS NULL
  2. IS NOT NULL
  3. ANY VALUE (NULL AND NOT NULL)(本質的WHERE句ないであろうということです)

私は正しい構文を思いつくために精神的なブロックを持っています。 IF @parameter BEGIN ... ENDブランチを実行せずに1つのselect文でこれを実行できますか?ここで

答えて

38

あなたは、単一のWHERE句を使用してこの問題を解決する方法である。

WHERE (@myParm = value1 AND MyColumn IS NULL) 
OR (@myParm = value2 AND MyColumn IS NOT NULL) 
OR (@myParm = value3) 

CASE文のナイーブ使用量が、私は次のことを意味し、このことで、は動作しません:

SELECT Field1, Field2 FROM MyTable 
WHERE CASE @myParam 
    WHEN value1 THEN MyColumn IS NULL 
    WHEN value2 THEN MyColumn IS NOT NULL 
    WHEN value3 THEN TRUE 
END 

ケースステートメントを使用してこれを解決することができます。answer

+0

あなたは私と同じ考えを持っていました。ただし、かっこが必要です。 – BobbyShaftoe

+0

ありがとうBobby、更新私の答え –

+1

私はあなたがかどうか*かっこが必要かどうかはわかりませんが、私は複雑なブール式のかっこを大いに支持しています。あなたが私に尋ねるならば、彼らはそれをコンパイラーに任せて注文命令を行い、むしろ恐ろしいものです。 –

-1

You shoul d CASEステートメントを見てください。

+0

これはもう一つの良い方法です。 – BobbyShaftoe

+0

CASEが1つの結果式で評価されるため、このシナリオでCASE文を使用できるとは思わない –

+0

このケースでは思ったほど単純ではありません。 WHERE句とOR-edを同じにするcase文をSELECT句に追加することはできますが、それは読みにくいSQL文を与えるだけです。私はこれを示すために私の答えを更新しました。 –

12

あなたはこのような何か行うことができます:

SELECT * 
FROM foo 
WHERE (@param = 0 AND MyColumn IS NULL) 
OR (@param = 1 AND MyColumn IS NOT NULL) 
OR (@param = 2) 

そのような何かを。

+0

文字列でフィルタリングする必要があるとします。文字列がnullの場合は、テーブルからすべてのレコードを返す必要があります.Nullでない場合は、文字列またはその一部(LIKE演算子)と一致するすべてのレコードを返す必要があります。それをどうやって解決しますか? – Axel

9
WHERE MyColumn = COALESCE(@value,MyColumn) 
  • @valueNULLであれば、それは @value = no where句を無視して、自分自身にMyColumnを比較します。 @value IF

  • は、 @valueMyColumnを比較する値(NOT NULL)を有しています。

参考:COALESCE (Transact-SQL)

+0

CASEが1つの結果式に評価されるため、このシナリオでCASEステートメントを使用できるとは思いません。 COALESCE、あるいはISNULLでも私はどちらかが働くとは思わない。 –

+0

私の編集を確認してください、あなたの質問に何かが完全に欠けていますか? –

+0

@Deviant - 私はあなたの質問をわずかに見逃していると思います。 MyColumnのWHERE句は、パラメータ値に直接関係しないので、別の値で設定する必要があります。つまり、NULLが渡された場合、WHERE句が否定されます。他の値が渡された場合、結果セットはMyColumnが既知の値を持たないMyColumnがその値と等しい場合にのみ得られます。 NULL値を持つMyColumnのWHERE句は扱われません。 –

10

これはCASEを使用して行うことができる方法である。

DECLARE @myParam INT; 
SET @myParam = 1; 

SELECT * 
    FROM MyTable 
WHERE 'T' = CASE @myParam 
      WHEN 1 THEN 
       CASE WHEN MyColumn IS NULL THEN 'T' END 
      WHEN 2 THEN 
       CASE WHEN MyColumn IS NOT NULL THEN 'T' END 
      WHEN 3 THEN 'T' END; 
5

CASEの他の方法:

SELECT * 
FROM MyTable 
WHERE 1 = CASE WHEN @myParm = value1 AND MyColumn IS NULL  THEN 1 
       WHEN @myParm = value2 AND MyColumn IS NOT NULL THEN 1 
       WHEN @myParm = value3       THEN 1 
      END 
+0

+1解決策。 :) –

0

私は、このソリューションで成功を収めてきました。それはPatrick'sのようなもので、ちょっと変わった感じです。これらの式は別々に、または順番に使用できます。パラメータが空白の場合は無視され、NULLを含む検索の列のすべての値が無視されます。

SELECT * FROM MyTable 
WHERE 
    --check to see if @param1 exists, if @param1 is blank, return all 
    --records excluding filters below 
(Col1 LIKE '%' + @param1 + '%' OR @param1 = '') 
AND 
    --where you want to search multiple columns using the same parameter 
    --enclose the first 'OR' expression in braces and enclose the entire 
    --expression 
((Col2 LIKE '%' + @searchString + '%' OR Col3 LIKE '%' + @searchString + '%') OR @searchString = '') 
AND 
    --if your search requires a date you could do the following 
(Cast(DateCol AS DATE) BETWEEN CAST(@dateParam AS Date) AND CAST(GETDATE() AS DATE) OR @dateParam = '')