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
Надеется, что это помогает ...
Update С точкой зрения производительности лучше использовать 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
Как раз сейчас я понял, что могу так же легко сделать это: выберите a. *, Case when (SELECT max (b.field1) FROM b, где b.field2 = a.tbl_a_PK) является нулевым, тогда 'не имеет данных в b' else 'имеет данные в b' end как b_status из a. но мне все еще интересно, в чем проблема с nvl. –
Вам нужны скобки, которые заключают в себе функцию select. Лучше всего использовать Coalesce() вместо Nvl() –