У меня есть сценарий ниже. Не могли бы вы исправить приведенный ниже запрос ..
where l.au=m.acad_group
and l.acad_prog = m.acad_prog
case when acad_plan is not null then and l.acad_plan = m.acad_plan else and 0=0
end case
case when l.acad_sub_plan is not null then and l.acad_sub_plan=m.acad_sub_plan
else and 0=0 end case;
Я удалил тег PL / SQL. PL / SQL - это язык программирования в СУБД Oracle, используемый для триггеров, функций и т. д., Но ваш запрос основан только на SQL.
Если я правильно понимаю, вы можете использовать OR
и AND
вместо CASE WHEN
вы можете попробовать это.
У меня небольшой вопрос по acad_plan is null
, какой acad_plan
вы хотите проверить, l.acad_plan
или m.acad_plan
?
where l.au=m.acad_group
AND l.acad_prog = m.acad_prog
AND (acad_plan is null OR( acad_plan is not null AND l.acad_plan = m.acad_plan))
AND (l.acad_sub_plan is null OR( l.acad_sub_plan is not null AND l.acad_sub_plan=m.acad_sub_plan))
Не используйте CASE WHEN
в предложении WHERE
. Используйте AND
и OR
и круглые скобки.
where l.au = m.acad_group
and l.acad_prog = m.acad_prog
and (and l.acad_plan = m.acad_plan or l.acad_plan is null)
and (and l.acad_sub_plan = m.acad_sub_plan or l.acad_sub_plan is null)
Существуют допустимые варианты использования CASE в предложении WHERE, особенно для того, чтобы заставить Oracle запускать один предикат перед другим (например, проверьте, что строка содержит только цифры, прежде чем выполнять для нее TO_NUMBER)
@Gary Myers: Это правда, хотя я бы предпочел написать безопасную функцию для такого случая. Для конкретного случая TO_NUMBER
мы даже можем использовать опцию ON DEFAULT
в Oracle 12c.
Условия
JOIN
должны быть в пунктеON
, а не в пунктеWHERE
. Научитесь использовать правильный синтаксисJOIN
.