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