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%')
LIKE ANY
はOR
ed条件に変換されますが、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%'
)
AND
をOR
に置き換えると、col <> 1 OR col <> 2
これは、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
;