Quelle est la meilleure façon d'inclure un paramètre d'entrée dans la clause WHERE
mais de l'exclure s'il est nul?
Il y a plusieurs façons, je crois, mais je ne me souviens pas alors.
Puis-je également utiliser la COALESCE()
? Mais je pense que ce n'est que pour sélectionner des valeurs?
Pour clarifier, disons une variable appelée @code ="1"
alors mon où serait Where type='B' AND code = @code
mais si @code is null
alors je veux seulement Where type='B'
- remarquez le manquant code = @code
.
Vous pouvez utiliser IsNull
where some_column = IsNull(@yourvariable, 'valueifnull')
[~ # ~] éditez [~ # ~] :
Ce que vous avez décrit dans le commentaire peut se faire comme:
where (@code is null or code = @code)
Que diriez-vous
WHERE (Column1 = @Var1 OR @Var1 IS NULL)
AND (Column2 = @Var2 OR @Var2 IS NULL)
Voici une autre approche
SELECT * FROM Thingies WHERE ( @thingId IS NULL OR ThingID = @thingId )
Si votre paramètre est NULL, le reste de l'expression OR ne sera pas évalué.
consultez cet article soigné ici . Il explique pourquoi "où (@param est nul ou Field = @ param)" ne fonctionne pas bien et quoi utiliser à la place.
Je voudrais suggérer une solution que j'ai trouvée sur un autre site :
SELECT * FROM Thingies
WHERE ThingID = isnull(@ThingId,ThingID)
Avec cette solution, si l'utilisateur sélectionne null
pour votre paramètre, votre requête renverra toutes les lignes comme résultat.
Cette question m'a vraiment aidé avec un problème similaire qui a eu quelques-uns d'entre nous se gratter la tête un peu. Je ne l'écris que si quelqu'un d'autre essaie la même approche et ne peut pas comprendre pourquoi cela ne fonctionne pas.
J'essayais d'évaluer uniquement une partie d'une clause WHERE en plusieurs parties si le @Parameter n'était pas nul. J'ai essayé de le faire comme ci-dessous, mais aucune ligne n'a toujours été renvoyée si @Parameter était nul.
DECLARE @Parameter int = null;
SELECT * FROM TABLE
WHERE [AlternateID] is not null
AND (@Parameter is not null AND [AlternateID] = @Parameter)
J'ai pensé à tort que (@Parameter is not null AND [AlternateID] = @Parameter)
ne ferait tout simplement pas partie de la clause WHERE complète si @Parameter était null. Cependant, cela faisait que la clause WHERE entière retournait false. Le remède était d'ajouter un OR 1 = 1 comme ci-dessous:
WHERE [AlternateID] is not null
AND (@Parameter is not null AND [AlternateID] = @Parameter OR 1=1)
Bien sûr, l'approche décrite par ALi (pas assez de réputation pour voter) résout ce problème plus efficacement.
WHERE [AlternateID] is not null
AND [Partner_Customer_ID] = ISNULL(@Parameter, [Partner_Customer_ID])
Vous pouvez utiliser ISNULL () ou rechercher explicitement des valeurs nulles comme d'autres l'ont mentionné. Cela devrait être OK tant que vous n'avez pas plus de 1 ou 2 paramètres d'entrée optionnels. Mais s'il y a plus de paramètres, cette approche serait très inefficace car les index que vous créez sur ces colonnes ne seront pas utilisés comme prévu. Dans un tel cas, je vous recommanderais d'utiliser SQL dynamique. Voici un excellent article qui explique pourquoi http://sqlinthewild.co.za/index.php/2009/03/19/catch-all-queries/