WHERE IS NULL, IS NOT NULL oder NO WHERE-Klausel auf SQL Server-Parameterwert abhängig
-
03-07-2019 - |
Frage
Ich habe eine gespeicherte Prozedur in SQL Server 2000, die eine Suche auf Basis von Parameterwerten führen. Für einen des Parameter übergeben, ich brauche eine andere WHERE
Klausel abhängig von seinem Wert - das Problem ist, dass die drei Werte wären, wo MyColumn
-
IS NULL
-
IS NOT NULL
-
ANY VALUE (NULL AND NOT NULL)
(im Wesentlichen keineWHERE
Klausel)
Ich habe einige mentale Blockade in der korrekten Syntax kommen. Ist dies möglich, in einer select-Anweisung zu tun, ohne etwas IF @parameter BEGIN ... END
Durchführung Verzweigung?
Lösung
Hier ist, wie Sie dies mit einer einzigen WHERE
Klausel lösen können:
WHERE (@myParm = value1 AND MyColumn IS NULL)
OR (@myParm = value2 AND MyColumn IS NOT NULL)
OR (@myParm = value3)
Eine naive Verwendung der CASE-Anweisung funktioniert nicht , damit meine ich die folgende:
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
Es ist möglich, dies mit einer Case-Anweisung zu lösen, siehe onedaywhen beantworten
Andere Tipps
Sie könnten nur etwas tun, wie folgt aus:
SELECT *
FROM foo
WHERE (@param = 0 AND MyColumn IS NULL)
OR (@param = 1 AND MyColumn IS NOT NULL)
OR (@param = 2)
So ähnlich.
Dies ist, wie kann es mit CASE
getan werden:
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)
-
Wenn
@value
NULL
ist, wird esMyColumn
sich vergleichen zu können, ignoriert@value = no where
Klausel. -
IF
@value
hat einen Wert (NOT NULL
) wird es vergleichenMyColumn
zu@value
.
Referenz: COALESCE (Transact-SQL) .
Eine andere Art und Weise von 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
Ich habe Erfolg mit dieser Lösung hat. Es ist fast wie Patrick, mit einem kleinen Twist. Sie können diese Ausdrücke einzeln oder nacheinander verwendet werden. Wenn der Parameter leer ist, so wird er ignoriert und alle Werte für die Spalte, die Ihre Suche angezeigt werden, einschließlich NULLS.
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 = '')