2015-04-04 71 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