2012-10-16 203 views
0

我在WHERE第一個DECODE像這樣使用解碼:在where子句

Where id = decode('&flag','Yes',(Select id from tab where id > 10),0) 

此代碼的工作,如果子查詢返回一個職位。如果我返回幾個,我得到一個錯誤,如ORA-01427,「單行子查詢返回多個行」

我試圖將'='更改爲'in',但我仍然得到相同錯誤!

任何想法?

擴展的例子:

WHERE Dop_id = (DECODE ('&prep_flag', 'Yes', 
    (SELECT Dop_id FROM 
        (SELECT DOP_id, name FROM TABLE) 
        WHERE name IS NOT NULL) 
, Dop_id)) 

如提及這個作品,如果在行選擇statmen的回報,而不是幾個。

+2

這是不可能的'='或'用,因爲IN'' DECODE()'不能返回一個集合作爲單個結果。你必須改變你的設計,或者使用'SELECT MAX(id)...'將你的設置限制爲單個結果。 – wweicker

回答

2

假設解碼只期待一個值,你必須Select id from tab where id > 10我會嘗試移動解碼的選擇之外:

WHERE id IN (
    SELECT decode('&flag', 'Yes', id, 0) 
    FROM tab 
    WHERE id > 10 
) 
+0

我明白了爲什麼我應該這樣做,你有推薦。但是我想使用whare子句中的解碼。如果該標誌是「是」,那麼我想要列名不爲空的所有id。 – Ishamael

0
WHERE Dop_id IN 
     (CASE &flag 
     WHEN 'Yes' 
     THEN (SELECT Dop_id 
       FROM TABLE 
       WHERE name IS NOT NULL) 
     ELSE Dop_id); 
+0

我在Case子句中添加了END。但是,我得到了和以前一樣的錯誤。 ORA-01427(單行子查詢返回多行) – Ishamael