web-dev-qa-db-ja.com

sql:すべてのようなvsすべてのような

LIKEにANYが必要な場合とALLが必要な場合がある理由を理解できません。私は両方の条件でANYを使用できるはずだと思います(括弧内の正規表現のいずれかに従うレコードを選択しようとしています)。

何らかの理由で、ANYを使用した最初のLIKEは問題なく機能します。犬の餌、血統、または慈悲を含むすべてのレコードが返されます。

ただし、2番目のLIKEにはALLが必要です。さもなければ、それは御馳走、補給品または湿った記録を除外しません。しかし、なぜ?ここではANYが適切なフォームのように感じます。

where dsc_item like any ('%DOG CHOW%','%PEDIGREE%','%BENEFUL%')
and dsc_comm not like all ('%TREATS%','%SUPPLIES%', '%WET%')
5
Adam

LIKE ANYORed条件に変換されますが、LIKE ALLAND

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

ANDORに置き換えると、col <> 1 OR col <> 2これは、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
;