Affectation de plusieurs résultats de CASE à WHERE col IN

Je reçois ce message lorsque j'utilise le cas et je ne veux pas avoir d'expression vérifiant si l'identifiant est vide ou non, ce serait du code supplémentaire inutile.

La sous-requête a renvoyé plus d'une valeur. Cela n'est pas autorisé lorsque la sous-requête suit =,! =, <, <=,>,> = Ou lorsque la sous-requête est utilisée comme une expression.

declare @idchar(2) set @id= '' select names from Units where id in( case @id when '' then (select id from Units) else @id end ) 

Vous pouvez réécrire votre requête comme suit:

 select names from Units where (@id = '' AND id in(select id from Units)) OR id = @id 

Dans ce cas, si @id est '' alors l' id in(select id from Units) condition id in(select id from Units) est évalué. Si toutefois @id a une autre valeur, alors la condition id = @id est évaluée. Cela suppose que @id ne peut pas avoir de valeur NULL .

EDIT: Après avoir regardé la requête, il semble que la requête peut être beaucoup simplifiée. Vous n'avez pas du tout besoin d'une partie IN , car vous essayez d'accéder à tous les loggings de la même table, vous pouvez donc utiliser une requête encore plus simple:

 select names from Units where @id = '' OR id = @id 

En supposant que vous n'avez jamais à faire face à des nulls, cela le ferait:

 SELECT names from Units where (id = @Id or (isnull(@Id, '') = ''))