在Postgresql中,当我使用OR进行SELECT时似乎不起作用。也许我做错了什么? 例如:
SELECT *
FROM toorder
WHERE product_id = 1193
AND status = 'NO'
OR status = 'YES'
结果给出的结果不是product_id = 1193。 状态字段有3个答案;在这个例子中是,否和DON。 任何人都知道为什么它不起作用?
答案 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