2013-10-23 50 views
4

我想解决的问题:Where语句,其中查询检查条件1是A还是B而条件2不是C,D在同一行。SQL:AND/OR语句的顺序

WHERE Condition1 LIKE 'A' OR Condition1 LIKE 'B' AND "Condition2" <> 'C' AND "Condition2" <> 'D' 

此内容是否有用?非常感谢!

回答

2

您在正确的轨道上,但您错过了ANDOR优先的事实。 我能想到的来表达你的期望的条件最优雅的方式如下:

SELECT * 
FROM some_table 
WHERE c1 IN ('A', 'B') AND c2 NOT IN ('C', 'D'); 
+1

@MartinSmith事实上 - 这应该是'c2' - 愚蠢的错字。谢谢你的收获! – Mureinik

+1

当你添加“你的条件将做的伎俩”,我删除了我的upvote,这是不正确的,因为没有分组。 – Asaph

+0

@Asaph - 事实上,你是对的 - 我错过了OP。好的赶上!我重申了我的答案,以解决这个错误。 – Mureinik

2

您应该组的子表达式在括号中,否则你冒着围绕什么是组合在一起歧义:

WHERE 
    (Condition1 = 'A' OR Condition1 = 'B') 
    AND 
    (Condition2 <> 'C' AND Condition2 <> 'D') 

在这种情况下你不真的需要围绕第二部分有括号,但你应该永远相同的子表达式结合了ANDOR

与原来的构造一个可能的问题是,表达式可以这样划分:

WHERE 
    Condition1 = 'A' 
    OR 
    (Condition1 = 'B' AND Condition2 <> 'C' AND Condition2 <> 'D') 
+1

不仅*表达式可以按照您在答案结尾展示的方式进行分组,而且由于AND与'OR'绑定的优先级高于'OR',因此如果缺少明确的括号,表达式*将被视为如何处理。 – eggyal

+0

因为我知道我有两个问题,1)我不能轻易阅读表达式并知道它是如何工作的,2)有些语言以其他方式拥有它(我知道我有两个问题,我虽然忘了)。因此,我已经学会了只需添加所需的括号,问题就解决了(永久)。 –

+1

没有哪种语言有其他方式。无论如何,没有可用的。这实际上违背了逻辑。 – Asaph