web-dev-qa-db-fra.com

sql: comme tout vs comme tous

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%')
5
Adam

LIKE ANY se traduit par ORed 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.

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