为什么我的SQL在Where子句中使用OR来返回不需要的记录

时间:2019-06-29 20:41:34

标签: sql amazon-redshift

可以说我在Redshift(http://sqlfiddle.com/#!17/c6c53/1)上有一个名为subscriptions的表:

    id  | subscription_type | subscription_origin
-------------------------------------------------
    100 | monthly           | trial_page
    101 | annual_trial      | sales_rep
    102 | monthly           | sales_rep
    103 | annual            | sales_rep

返回订阅类型中没有“ trial”的所有行看起来都是正确的:

select * from subscriptions where subscription_type NOT LIKE '%trial%'
 http://sqlfiddle.com/#!17/c6c53/2

但是我想返回的所有在 subscription_type或subscription_origin中没有“ trial”的行。

所以我写了这个查询:

SELECT * 
FROM subscriptions 
WHERE subscription_type NOT LIKE '%trial%' OR
subscription_origin NOT LIKE '%trial_page%'

但是http://sqlfiddle.com/#!17/c6c53/3返回所有行。

如何排除字符串中包含试验的所有行?

1 个答案:

答案 0 :(得分:4)

您必须使用AND

SELECT * 
FROM subscriptions 
WHERE subscription_type NOT LIKE '%trial%' 
  AND subscription_origin NOT LIKE '%trial_page%';

sqlfiddle demo

以下是布尔代数知识很有用的示例:

  

De Morgan's laws

     

规则可以用英语表达为:

     
      
  • 析取式的取反是取反的合取;和

  •   
  • 一个合取式的取反就是该取反的取和;

  •   

假设您要查找col1 LIKE A OR col2 LIKE B的字符串:

-- assuming that both columns are not nullable
NOT(col1 LIKE A OR col2 LIKE B) <=> col1 NOT LIKE A AND col2 NOT LIKE B