我正在尝试运行以下查询:

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/

10-12 00:36