Sql: как любой vs, как все

Я не могу понять, почему иногда LIKE требует ЛЮБОГО, а иногда и требует ВСЕ, и это делает меня сумасшедшим. Я чувствую, что я должен использовать ЛЮБОЙ в обоих условиях (я пытаюсь выбрать записи, следующие за любыми выражениями регулярных выражений в круглых скобках).

По какой-то причине первый LIKE, с ЛЮБОЙ, работает просто отлично - он возвращает все записи с собачьей чау, родословной или благим.

Второй LIKE, однако, требует ВСЕ. В противном случае он не будет оставлять записи с обработкой, поставками или мокрой. Но почему? Я чувствую, что ЛЮБОЙ является подходящей формой здесь.

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

Ответ 1

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.

Ответ 2

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
;