7

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

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:缺少表达'

4

3 回答 3

7

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
于 2013-05-22T17:29:11.650 回答
1

如果您在 a 中搜索在 b 中有/没有关联记录的记录

select a.*, 
       case when b.field2 is null then 'has no data in b'
                                  else 'has data in b'
        as b_status
from a left outer join b
on a.tbl_a_PK = b.field2;

应该这样做

于 2013-05-22T15:45:58.233 回答
1

NVL(string1, replace_with) 函数需要 2 个参数,请参阅此处的 文档: http
://www.techonthenet.com/oracle/functions/nvl.php Ora 10g 文档:http ://docs.oracle.com/cd/B19306_01 /server.102/b14200/functions105.htm
既然你知道问题所在,这个查询可以解决它:

select a.*,
       case
         when (SELECT NVL(b.field2, 0) FROM b where b.field2 = a.tbl_a_PK and rownum = 1) > 0 then
          'has data in b'
         else
          'has no data in b'
       end b_status
  from a

并且跑得更快。
您不需要 max() 来检查该值是否存在于另一个表中,只需检查主键是否不为空。

于 2013-05-22T15:51:49.533 回答