Je veux calculer une expression booleanne comme celle-ci
((('a' or 'b') AND ('c' or 'd') AND ('e' or 'f')) IN (SELECT COLUMN1 FROM...))
('a', 'b' … sont toutes des strings)
Bien sûr, si j'écris une requête comme celle-là, SQL Server lancera une erreur car 'a', 'b' … ne sont pas de type boolean.
Quelqu'un peut-il m'aider à écrire une requête plus courte pour calculer cette expression que ci-dessous:
((('a' in (select..)) or (('b' in (select...))) AND ((('c' in (select..)) or (('d' in (select...))) AND ((('e' in (select..)) or (('f' in (select...)))
Merci.
`EDIT: add more infor about my query`
Ceci est ma requête (bien sûr, cela n'a pas fonctionné)
SELECT ID, Name, Addr, PhoneNumber, Descr FROM CusInfo WHERE Type_ID = 'type_01' AND `((('a' or 'b') AND ('c' or 'd') AND ( 'e' or 'f')) IN (SELECT Cri_ID FROM CusCri WHERE CusCri.Cus_ID = CusInfo.ID))`
Tout ce que je veux, c'est calculer (('a' or 'b') AND ('c' or 'd') AND ( 'e' or 'f')) IN (SELECT Cri_ID FROM CusCri WHERE CusCri.Cus_ID = CusInfo.ID)
tant que boolean.
Essayez (mis à jour, suite à la question modifiée):
SELECT ID, Name, Addr, PhoneNumber, Descr FROM CusInfo i WHERE Type_ID = 'type_01' AND 3 = (select count(distinct case when c.Cri_ID in ('a','b') then 1 when c.Cri_ID in ('c','d') then 2 when c.Cri_ID in ('e','f') then 3 end) from CusCri c WHERE c.Cus_ID = i.ID and c.Cri_ID in ('a','b','c','d','e','f') )
MISE À JOUR Après avoir vu la structure réelle de la table, cela devrait fonctionner:
SELECT ID, Name, Addr, PhoneNumber, Descr, MeetsCriteria = ( CASE WHEN COUNT(CI.Cus_ID) > 0 THEN 1 ELSE 0 END ) FROM CusInfo CI LEFT OUTER JOIN CusCri CC ON CusInfo.ID = CusCri.Cus_ID WHERE [Type_ID] = 'type_01' AND ( CusCri.Cri_ID = 'a' OR CusCri.Cri_ID 'b' ) AND ( CusCri.Cri_ID = 'c' OR CusCri.Cri_ID 'd' ) AND ( CusCri.Cri_ID = 'e' OR CusCri.Cri_ID 'f' ) GROUP BY ID, Name, Addr, PhoneNumber, Descr, CusCri.Cri_ID
ANCIENNE RÉPONSE – Partir pour reference
Une auto-jointure peut être plus rapide qu'un groupe d'instructions IN
(test et see).
SELECT MT1.* FROM MyTable MT1 INNER JOIN MyTable MT2 ON MT1.Column1 = MT2.Column1 AND MT1.Column1 = 'A' OR MT1.Column1 = 'B' etc...
Je devrais voir les data structures pour savoir si c'était une méthode viable ou non.
Voici un exemple plus concret que j'ai créé contre certaines de mes propres données réelles; Je ne considérerais cela comme une bonne pratique que si elle n'était pas utilisée contre des données textuelles avec des caractères generics (en particulier le non-sargable "% T"), mais c'est la façon la plus simple de le démontrer.
SELECT SE1.Caption FROM SearchEntity SE1 INNER JOIN SearchEntity SE2 ON SE1.Caption = SE2.Caption AND ( -- starts with A or B ( SE1.Caption LIKE 'A%' OR SE2.Caption LIKE 'B%' ) -- starts with C and ends with T OR ( SE1.Caption LIKE 'C%' AND SE1.Caption LIKE '%T' ) )
Vous pouvez probablement utiliser un CTE .
with t1(col1) as (SELECT COLUMN1 FROM...) select * from t1 where 'a' in (t1.Col1) or 'b' in (t1.col1) ...etc...