2015-04-04 41 views
0

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

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

结果给我说不是的product_id = 1193也是结果。 状态字段有3个答案;在这个例子中是YES,NO和DON。 有人知道为什么它不起作用吗?

+1

有两种方法可以将where子句加括号。试试他们两个。另一种方式是'SELECT * FROM to order WHERE product_id = 1193 AND status IN('NO','YES')' – wildplasser 2015-04-04 12:47:59

回答

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

括号括起来,圆一个属于一起的逻辑,否则或将要运行对所有的记录,而不是仅仅的product_id = 1193

4

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

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

这意味着你得到所有结果与product_id = 1193status = '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') 

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

+0

非常感谢!我现在明白了。 – psql 2015-04-06 19:04:27