Je ne peux pas comprendre pourquoi parfois LIKE nécessite TOUT et d'autres fois, il nécessite TOUS, et cela me rend fou. Je pense que je devrais pouvoir utiliser TOUT dans les deux conditions (j'essaie de sélectionner des enregistrements suivant l'une des expressions d'expression régulière entre parenthèses).
Pour une raison quelconque, le premier LIKE, avec TOUT, fonctionne très bien - il renvoie tous les enregistrements avec dog chow, pedigree ou beneful.
Le second LIKE, cependant, nécessite TOUS. Sinon, il ne laissera pas de traces de friandises, de fournitures ou humides. Mais pourquoi? J'ai l'impression que TOUT est la forme appropriée ici.
where dsc_item like any ('%DOG CHOW%','%PEDIGREE%','%BENEFUL%')
and dsc_comm not like all ('%TREATS%','%SUPPLIES%', '%WET%')
LIKE ANY
se traduit par OR
ed condition, mais LIKE ALL
à AND
:
where
( dsc_item like '%DOG CHOW%'
OR dsc_item like '%PEDIGREE%','%BENEFUL%'
)
and
( dsc_comm not like '%TREATS%'
AND dsc_comm not like '%SUPPLIES%'
AND dsc_comm not like '%WET%'
)
Si vous remplacez le AND
par OR
c'est comme col <> 1 OR col <> 2
ce qui est vrai pour chaque ligne non NULL.
like any similar to = any
like all similar to = all
not like any similar to <> any
not like all similar to <> all
select 'My name is Inigo Montoya, you killed mhy father, prepare to die!' as str
,case when str like any ('%Inigo%','%Donald%' ,'%Hillary%') then 1 else 0 end -- 1
,case when str like any ('%Adam%' ,'%Donald%' ,'%Hillary%') then 1 else 0 end -- 0
,case when str like all ('%Inigo%','%Montoya%','%father%') then 1 else 0 end -- 1
,case when str like all ('%Inigo%','%Montoya%','%mother%') then 1 else 0 end -- 0
,case when str not like any ('%Inigo%','%Montoya%','%mother%') then 1 else 0 end -- 1
,case when str not like any ('%Inigo%','%Montoya%','%father%') then 1 else 0 end -- 0
,case when str not like all ('%Adam%' ,'%Donald%' ,'%Hillary%') then 1 else 0 end -- 1
,case when str not like all ('%Inigo%','%Donald%' ,'%Hillary%') then 1 else 0 end -- 0
;