2012-10-16 176 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