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

1 sql postgresql boolean-logic

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

SELECT * 
FROM toorder 
WHERE product_id = 1193 
AND status = 'NO' 
OR status = 'YES' 
Run Code Online (Sandbox Code Playgroud)

结果也给了我不是 product_id = 1193 的结果。状态字段有 3 个答案;在此示例中为 YES、NO 和 DON。任何人都知道为什么它不起作用?

Mat*_*sOl 5

OR运营商工作得很好,正在发生的事情是,你在做什么是等同于事实:

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

这意味着您将获得所有结果 with product_id = 1193that have status = 'NO',以及所有其他(无论哪个product_id)与status = 'YES'. 发生这种情况是因为AND运算符优先于OR运算符(实际上OR是优先级最低的那个)。

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

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

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

补充...正如@wildplasser 所建议的,在这种特定情况下,您可以通过使用IN运算符来进一步简化事情:

SELECT * FROM toorder
WHERE product_id = 1193 AND status IN ('NO', 'YES')
Run Code Online (Sandbox Code Playgroud)

这在逻辑上等同于前面的查询。