Where clause when table n'est pas nulle et renvoie une list d'users et d'users appartenant au même état

Je cherche à returnner les valeurs des clients qui peuvent être filtrés si une list personnalisée est définie dans la database.

Si la list personnalisée est téléchargée, je souhaite écrire une requête pour renvoyer tous les clients de cette list ainsi que tous les clients appartenant à cet état. Sinon, renvoyez simplement une list non filtrée si aucune list n'a été définie.

C'est ce que j'ai écrit en espérant que cela permettrait d'atteindre mon objective, mais il échoue à filterr si la list a été téléchargée et renvoie les mêmes données si elle est mise en commentaire:

SELECT U.userId ,U.State FROM UsersAndStates U LEFT JOIN @CustomUsersAndState C -- variable table where custom list is stored for this query on U.userId= C.userId WHERE U.userId LIKE CASE WHEN C.userId IS NOT NULL THEN '%' + C.userId + '%' WHEN C.userId IS NULL THEN '%' + U.userId + '%' WHEN C.State = U.State THEN '%' + U.userId + '% END 

Merci pour la lecture.

edit: erreur d'alias fixe

Votre logique simplifie pour:

 SELECT U.userId, U.State FROM UsersAndStates U LEFT JOIN @CustomUsersAndState C -- variable table where custom list is stored for this query ON U.userId= C.userId WHERE (C.UserId IS NOT NULL AND U.userId LIKE '%' + C.userId + '%') OR C.userId IS NULL 

Vous pourriez requestr: "Qu'est-il arrivé à la condition d'état?" Eh bien, c.userId est NULL ou non NULL , donc la troisième condition dans le CASE n'est jamais exécutée.

Généralement, les expressions booleannes sont considérées comme plus faciles à suivre que les instructions CASE dans une clause WHERE . À tout le less, ils sont plus faciles à gérer pour l'optimiseur.

Si je vous comprends correctement, vous sembleriez vouloir:

 SELECT U.userId, U.State FROM UsersAndStates U LEFT JOIN @CustomUsersAndState C -- variable table where custom list is stored for this query ON U.userId = C.userId WHERE (C.UserId IS NOT NULL AND (U.userId LIKE '%' + C.userId + '%' OR U.state = C.state ) ) OR C.userId IS NULL 

Je ne comprends pas pourquoi vous utilisez LIKE pour userId , quand = semble suffire:

 WHERE (C.UserId IS NOT NULL AND (U.userId = C.userId OR U.state = C.state) ) OR C.userId IS NULL 

MODIFIER:

Je pense que la logique que vous voulez vraiment est:

 SELECT U.userId, U.State FROM UsersAndStates U WHERE NOT EXISTS (SELECT 1 FROM @CustomUsersAndState C) OR EXISTS (SELECT 1 FROM @CustomUsersAndState C WHERE U.userId LIKE C.userId OR U.state = C.state );