2013-02-20 75 views
2

我試圖根據IN參數來制定WHERE子句。出於這個原因,我正在做一些關於在WHERE IN子句中使用CASE的實驗。這是什麼工作正常:在WHERE IN中使用CASE條款

SELECT * FROM TABLE1 WHERE COL1 IN (SELECT ID FROM TABLE2); 

考慮我有一個名爲P1的輸入參數。該類型不是必需的。如果P1的值爲null,則以下一個也能正常工作:

SELECT * FROM TABLE1 WHERE COL1 IN (CASE P1 WHEN NULL THEN COL1 ELSE (SELECT ID FROM TABLE2)); 

但如果P1不爲NULL,我得到

ORA-01427:單行子查詢返回不止一行

錯誤。

如果你想知道爲什麼我需要這個,讓我快速解釋它。存儲過程將接受許多輸入參數。其中一些將是用戶定義的集合類型。並且所有參數都是可選DEFAULT NULL值。所以我想檢查一個參數是否爲NULL,如果是這種情況,那麼比較與該參數相對應的列對其本身(這意味着該列沒有過濾器),否則使用參數內的值(s)過濾列。我試圖以某種方式嘗試嗎?

回答

1

由於COL1 IN (COL1)是一樣的true,你可以重寫你的查詢是這樣的:

SELECT * 
FROM TABLE1 
WHERE P1 IS NULL OR COL1 IN (SELECT ID FROM TABLE2); 

一般來說,CASE/WHEN/END子句只能用於SELECT的「投影」部分;您需要使用「常規」布爾表達式在WHERE子句中。

+0

太棒了。非常感謝。 – 2013-02-20 14:01:31

3

您的ELSE包含返回多行的SELECT

相反,你可以測試之前測試NULL:

SELECT * FROM TABLE1 WHERE (P1 IS NULL) OR (COL1 IN (SELECT ID FROM TABLE2));