Sql 在where子句中使用decode
我的Sql 在where子句中使用decode,sql,oracle,plsqldeveloper,Sql,Oracle,Plsqldeveloper,我的WHERE子句中有一个DECODE,如下所示: Where id = decode('&flag','Yes',(Select id from tab where id > 10),0) 如果子查询返回一篇文章,则此代码有效。如果我返回多行,我会得到一个错误,如ORA-01427,“单行子查询返回多行” 我尝试将“=”更改为“in”,但仍然出现相同的错误 有什么想法吗 扩展示例: WHERE Dop_id = (DECODE ('&prep_flag', 'Yes',
WHERE
子句中有一个DECODE
,如下所示:
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))
如前所述,如果select statmen返回第行,而不是几行,则此操作有效。假设decode只需要一个值,其中您有
select id from选项卡,其中id>10
我会尝试将select移到decode之外:
WHERE id IN (
SELECT decode('&flag', 'Yes', id, 0)
FROM tab
WHERE id > 10
)
使用
=
或中的时,这是不可能的,因为DECODE()
不能将集合作为单个结果返回。您必须更改设计,或使用SELECT MAX(id)…
将设置限制为单个结果。我明白为什么我应该按照您建议的方式进行设置。但我想用whare条款的解码。如果标志是Yes,那么我需要列名不为null的所有id。我在Case子句中添加了一个END。但是我得到了和以前一样的错误。ORA-01427(单行子查询返回多行)
WHERE Dop_id IN
( CASE &flag
WHEN 'Yes'
THEN (SELECT Dop_id
FROM TABLE
WHERE name IS NOT NULL)
ELSE Dop_id);