我正在尝试运行以下查询:
select a.*,
case when NVL (SELECT max(b.field1)
FROM b
where b.field2 = a.tbl_a_PK , 'TRUE') = 'TRUE'
then 'has no data in b'
else 'has data in b' end as b_status
from a
我检查了一下,nvl内部的选择仅返回1值(因此那里应该没有问题)。
但是我得到“ ORA-00936:缺少表达”
最佳答案
NVL()
需要2个参数:要测试的表达式和默认值,例如nvl(some_field, 111)
。您只需要用大括号将查询参数隔离开,并提供第二个参数,例如以下语句:
select nvl( (select 1 from dual), 34) from dual
在您的变体中,解析器期望
SELECT
关键字后出现逗号,并且无法解析剩余的字符串。确切地说,您的声明必须如下所示:
select
a.*,
case when NVL(
( SELECT max(b.field1)
FROM b
where b.field2 = a.tbl_a_PK
),
'TRUE'
) = 'TRUE'
then 'has no data in b'
else 'has data in b' end as b_status
from a
希望这可以帮助 ...
更新资料
就性能而言,最好使用
exists
而不是max
:select
a.*,
case when exists
( SELECT null
FROM b
where b.field2 = a.tbl_a_PK
and
b.field2 is not null
and
rownum = 1
),
then 'has data in b'
else 'has no data in b' end as b_status
from a
关于oracle - NVL中的Select语句,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16695978/