Je fais une recherche, où les utilisateurs choisissent dans le menu déroulant certaines clauses. Quand ils laissent une case vide, je veux que la requête ignore la clause. Je connais CASE, et le mieux que j'ai pensé est que si je passe 0 au paramètre dans la procédure stockée, il ignore ce paramètre, comme ceci.
WHERE a.Country = (CASE WHEN @Country > 0 THEN @Country ELSE (something else) END)
donc, (autre chose) devrait être comme aucune condition, il peut être '> 0' car les identifiants de pays sont de tous> 1, mais je ne sais pas comment utiliser> et = dans le même CAS.
Aucune suggestion?
Quelques façons:
-- Do the comparison, OR'd with a check on the @Country=0 case
WHERE (a.Country = @Country OR @Country = 0)
-- compare the Country field to itself
WHERE a.Country = CASE WHEN @Country > 0 THEN @Country ELSE a.Country END
Ou, utilisez une instruction générée dynamiquement et ajoutez uniquement la condition Pays, le cas échéant. Cela devrait être plus efficace dans le sens où vous n'exécutez une requête qu'avec les conditions qui doivent réellement s'appliquer et peut entraîner un meilleur plan d'exécution si des indices de prise en charge sont en place. Vous devez utiliser du SQL paramétré pour éviter une injection SQL.
Vous pouvez simplifier pour:
WHERE a.Country = COALESCE(NULLIF(@Country,0), a.Country);
(something else)
devrait être a.Country
si Country
est nullable alors make(something else)
être a.Country OR a.Country is NULL
.. ELSE a.Country ...
Je suppose
Essaye ça:
WHERE a.Country = (CASE WHEN @Country > 0 THEN @Country ELSE a.Country END)