sql:喜欢任何vs像所有

时间:2016-11-07 22:40:39

标签: sql teradata

我无法弄清楚为什么有时候LIKE需要ANY,有时候需要ALL,这会让我发疯。我觉得我应该能够在两种情况下都使用ANY(我试图在括号中的任何正则表达式之后选择记录)。

出于某种原因,第一个LIKE,任何一个,都可以正常工作 - 它会返回所有带有狗食,谱系或有趣的记录。

然而,第二个LIKE需要ALL。否则,它不会遗漏处理,供应或潮湿的记录。但为什么?我觉得这里的任何形式都是合适的。

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

2 个答案:

答案 0 :(得分:5)

LIKE ANY转换为OR条件,但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行都是如此。

答案 1 :(得分: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
;