或者在Postgres中没有按预期工作

时间:2015-04-04 12:40:47

标签: sql postgresql boolean-logic

在Postgresql中,当我使用OR进行SELECT时似乎不起作用。也许我做错了什么? 例如:

SELECT * 
FROM toorder 
WHERE product_id = 1193 
AND status = 'NO' 
OR status = 'YES' 

结果给出的结果不是product_id = 1193。 状态字段有3个答案;在这个例子中是,否和DON。 任何人都知道为什么它不起作用?

2 个答案:

答案 0 :(得分:4)

OR运算符工作正常,发生的事情是你正在做的事实上等同于:

-- WRONG (not expected):
SELECT * FROM toorder
WHERE (product_id = 1193 AND status = 'NO') OR (status = 'YES')

这意味着您获得product_id = 1193 status = 'NO'的所有结果,以及product_id的所有结果(无论status = 'YES'})。发生这种情况because AND operator has precedence over OR operator(实际上OR是优先级最低的那个)。

因此,在您的情况下,您应该使用显式括号来根据需要设置优先级:

-- CORRECT (expected):
SELECT * FROM toorder
WHERE product_id = 1193 AND (status = 'NO' OR status = 'YES')

建议在混合使用不同类型的运算符时始终使用括号,即使在您希望使用默认优先级的情况下,也有助于使代码更清晰并提高可维护性。

补充......正如@wildplasser建议的那样,在这种特定情况下,您可以使用IN运算符进一步简化操作:

SELECT * FROM toorder
WHERE product_id = 1193 AND status IN ('NO', 'YES')

这在逻辑上等同于上一个查询。

答案 1 :(得分:0)

SELECT * FROM toorder WHERE product_id = 1193 AND (status = 'NO' OR status = 'YES')

将括号括在一起的逻辑中,否则OR将对所有记录运行,而不仅仅是product_id = 1193