可以说我在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返回所有行。
如何排除字符串中包含试验的所有行?
答案 0 :(得分:4)
您必须使用AND
:
SELECT *
FROM subscriptions
WHERE subscription_type NOT LIKE '%trial%'
AND subscription_origin NOT LIKE '%trial_page%';
以下是布尔代数知识很有用的示例:
规则可以用英语表达为:
析取式的取反是取反的合取;和
一个合取式的取反就是该取反的取和;
假设您要查找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