在Postgresql中,當我使用OR進行SELECT時似乎不起作用。也許我做錯了什麼? 例如:或不按預期在Postgres中工作
SELECT *
FROM toorder
WHERE product_id = 1193
AND status = 'NO'
OR status = 'YES'
結果給我說不是的product_id = 1193也是結果。 狀態字段有3個答案;在這個例子中是YES,NO和DON。 有人知道爲什麼它不起作用嗎?
在Postgresql中,當我使用OR進行SELECT時似乎不起作用。也許我做錯了什麼? 例如:或不按預期在Postgres中工作
SELECT *
FROM toorder
WHERE product_id = 1193
AND status = 'NO'
OR status = 'YES'
結果給我說不是的product_id = 1193也是結果。 狀態字段有3個答案;在這個例子中是YES,NO和DON。 有人知道爲什麼它不起作用嗎?
SELECT * FROM toorder WHERE product_id = 1193 AND (status = 'NO' OR status = 'YES')
括號括起來,圓一個屬於一起的邏輯,否則或將要運行對所有的記錄,而不是僅僅的product_id = 1193
的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')
這在邏輯上等同於前一查詢。
非常感謝!我現在明白了。 – psql 2015-04-06 19:04:27
有兩種方法可以將where子句加括號。試試他們兩個。另一種方式是'SELECT * FROM to order WHERE product_id = 1193 AND status IN('NO','YES')' – wildplasser 2015-04-04 12:47:59