2013-11-21 100 views
2

我正在使用具有用於生成SQL查詢的自定義java實現的遺留系統。這不支持'IN'操作。 要實現「IN」我已經寫了類似SQL使用'OR'實現'IN'運算符

SELECT * from Q 
WHERE IS_HIDDEN = 0 AND ID = 1 
OR ID = 2 OR ID = 3 AND IS_DELETED = 0; 

我知道,像下面的人會被罰款。

SELECT * from Q 
WHERE IS_HIDDEN = 0 AND (ID = 1 
OR ID = 2 OR ID = 3) AND IS_DELETED = 0 ; 

這兩個都返回相同的結果,但我對SQL運算符優先級不太確定。我已經讀過並優先考慮 假設兩個SQL狀態碼是等價的,是否安全?

,我想寫的實際查詢是

SELECT * from Q 
WHERE IS_HIDDEN = 0 AND ID IN(1, 2, 3) AND IS_DELETED = 0; 

的DB的問題是Oracle 10g中。

更新:這是工作的原因是因爲oracle CBO重新排列where子句中的子條款。

+0

你的問題是什麼?用'IN'查詢是正確的 – MartinB

+0

現在的問題是兩個查詢與IN一樣。 – nikhil

回答

2

沒有你的查詢都是不一樣的

SELECT * from Q 
WHERE IS_HIDDEN = 0 AND ID = 1 
OR ID = 2 OR ID = 3 AND IS_DELETED = 0; 

就像

SELECT * FROM Q WHERE IS_HIDDEN = 0 AND ID = 1 
UNION 
SELECT * FROM Q WHERE ID = 2 
UNION 
SELECT * FROM Q WHERE ID = 3 AND IS_DELETED = 0 

當您使用括號爲您的OR,那麼你必須像IN子句

你一樣可以試試看:SQLFiddle

+0

在SQLFiddle上,行爲與您所描述的一樣,但在本地oracle數據庫中,所有三者都返回相同的結果。 無論我對推送現有查詢沒有信心,我會尋求擴展框架。 感謝您的意見。 – nikhil

1

你先查詢是否等於IN。您應該使用:

你的第二個查詢是這樣的:

SELECT * from Q 
WHERE (IS_HIDDEN = 0 AND ID = 1) OR ID = 2 OR (ID = 3 AND IS_DELETED = 0); 

如果IS_HIDDEN爲1或刪除的1,但ID爲2,您的查詢仍然會給你的記錄。試試吧..

+0

感謝您的輸入。看起來這些並不等同。 – nikhil