web-dev-qa-db-fra.com

Vérifier un paramètre d'entrée sinon Null et l'utiliser dans où dans SQL Server

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?

Éditer

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.

34
Martin

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)
66

Que diriez-vous

WHERE (Column1 = @Var1 OR @Var1 IS NULL)
AND (Column2 = @Var2 OR @Var2 IS NULL)
9
Adriaan Stander

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é.

7
Paul Alan Taylor

consultez cet article soigné ici . Il explique pourquoi "où (@param est nul ou Field = @ param)" ne fonctionne pas bien et quoi utiliser à la place.

6
DForck42

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.

5
ali

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])    
3
Philip Derbyshire

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/

1
Sadhir