SQL Serverのパラメーター値に応じて、WHERE IS NULL、IS NOT NULLまたはNO WHERE句

StackOverflow https://stackoverflow.com/questions/810714

  •  03-07-2019
  •  | 
  •  

質問

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

の場所になることです
  1. IS NULL
  2. IS NOT NULL
  3. 任意の値(NULL AND NOT NULL)(本質的に WHERE 句なし)

正しい構文を思い付くのに精神的な障害があります。これは、 IF @parameter BEGIN ... END 分岐を実行せずに1つのselectステートメントで実行できますか?

役に立ちましたか?

解決

単一の 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

caseステートメントを使用してこれを解決することができます。onedaywhenの回答

を参照してください。

他のヒント

次のようなことができます:

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

そのようなもの。

これは、 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;
WHERE MyColumn = COALESCE(@value,MyColumn) 
  • @value NULL の場合、 MyColumn をそれ自体と比較し、無視します @value = no where 句。

  • IF @value には値( NOT NULL )があり、 MyColumn と比較します @value

参照: COALESCE(Transact-SQL)

別の場合:

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

このソリューションで成功しました。パトリックのように、少しひねりを加えています。これらの式は個別に使用することも、順番に使用することもできます。パラメーターが空白の場合、パラメーターは無視され、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 = '')
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top