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
;