web-dev-qa-db-fra.com

CAS dans WHERE, SQL Server

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?

19
el ninho

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.

28
AdaTheDev

Vous pouvez simplifier pour:

WHERE a.Country = COALESCE(NULLIF(@Country,0), a.Country);
5
Aaron Bertrand

(something else) devrait être a.Country

si Country est nullable alors make(something else) être a.Country OR a.Country is NULL

3
SliverNinja - MSFT
.. ELSE a.Country ...

Je suppose

1
tanathos

Essaye ça:

WHERE a.Country = (CASE WHEN @Country > 0 THEN @Country ELSE a.Country END)
1
Mahmoud Gamal