Clause WHERE IS NULL, IS NOT NULL ou NO WHERE selon la valeur du paramètre SQL Server
-
03-07-2019 - |
Question
J'ai une procédure stockée dans SQL Server 2000 qui effectue une recherche en fonction des valeurs de paramètre. Pour l’un des paramètres passés, il me faut une clause WHERE
différente en fonction de sa valeur - le problème est que les 3 valeurs se trouvent où MyColumn
-
IS NULL
-
N'EST PAS NUL
-
TOUTE VALEUR (NULL AND NOT NULL)
(essentiellement pas de clauseWHERE
)
J'ai un problème mental à trouver la syntaxe correcte. Est-il possible d'effectuer une instruction select sans effectuer de ramification IF @parameter BEGIN ... END
?
La solution
Voici comment résoudre ce problème en utilisant une seule clause WHERE
:
WHERE (@myParm = value1 AND MyColumn IS NULL)
OR (@myParm = value2 AND MyColumn IS NOT NULL)
OR (@myParm = value3)
Un usage naïf de l'instruction CASE ne fonctionne pas , j'entends par là le texte suivant:
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
Il est possible de résoudre ce problème à l'aide d'une instruction case, voir la answer de onedaywhen.
Autres conseils
Vous pouvez simplement faire quelque chose comme ceci:
SELECT *
FROM foo
WHERE (@param = 0 AND MyColumn IS NULL)
OR (@param = 1 AND MyColumn IS NOT NULL)
OR (@param = 2)
Quelque chose comme ça.
Voici comment cela peut être fait avec 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)
-
Si
@value
estNULL
, il compareraMyColumn
à lui-même, en ignorant@value = no where
clause. -
SI
@value
a une valeur (NOT NULL
), il compareraMyColumn
à@value
.
Référence: COALESCE (Transact-SQL) .
Une autre manière de 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
J'ai eu du succès avec cette solution. C'est presque comme chez Patrick, avec une petite touche. Vous pouvez utiliser ces expressions séparément ou en séquence. Si le paramètre est vide, il sera ignoré et toutes les valeurs de la colonne recherchée, y compris NULLS, seront affichées.
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 = '')