パラメータ値に基づいて検索を実行するストアドプロシージャがSQL Server 2000にあります。渡されたパラメーターの1つには、その値に応じて異なるWHERE
句が必要です-問題は、3つの値がMyColumn
の場所になることです
IS NULL
_IS NOT NULL
_ANY VALUE (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の answer を参照してください。
次のようなことができます。
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
の場合、@value = no where
句を無視して、MyColumn
をそれ自体と比較します。
@value
に値(NOT NULL
)がある場合、MyColumn
と@value
を比較します。
ケースの別の方法:
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 = '')