在where子句中使用decode

时间:2012-10-16 22:38:00

标签: sql oracle plsqldeveloper

我的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))

如前所述,如果选择的统计数据在行上返回,而不是几个。

2 个答案:

答案 0 :(得分:2)

假设解码只是期望你有Select id from tab where id > 10的单个值,我会尝试在解码之外移动选择:

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

答案 1 :(得分:0)

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