Использование NVL для нескольких столбцов - Oracle SQL
Доброе утро, мои любимые волшебники и колдуны!
Я хочу заменить на 3 столбца данных в 3 таблицах. В настоящее время я использую функцию NVL, однако она ограничена двумя столбцами.
Смотрите ниже пример:
SELECT ccc.case_id,
NVL (ccvl.descr, ccc.char)) char_val
FROM case_char ccc, char_value ccvl, lookup_value lval1
WHERE
ccvl.descr(+) = ccc.value
AND ccc.value = lval1.descr (+)
AND ccc.case_id IN ('123'))
case_char table
case_id|char |value
123 |email| work_email
124 |issue| tim_
char_value table
char | descr
work_email | complaint mail
tim_ | timeliness
lookup_value table
descr | descrlong
work_email| xxx@blah.com
По сути, я пытаюсь сделать, если существует совпадение для case_char.value с lookup_value.descr, затем отобразить его, если нет, то, если существует совпадение с case_char.value и char_value.char, отобразить его.
Я просто пытаюсь вернуть описание для "вопроса" из таблицы char_value, но для "электронной почты" я хочу вернуть descrlong из таблицы lookup_value (все под тем же псевдонимом "char_val").
Поэтому мой вопрос заключается в том, как мне добиться этого, имея в виду, что я хочу, чтобы они появлялись под одним и тем же псевдонимом.
Дайте мне знать, если вам нужна дополнительная информация.
Спасибо, парни
2 ответа
Вы можете вложить NVL:
NVL(a, NVL(b, NVL(c, d))
Но, что еще лучше, используйте SQL-стандарт COALESCE, который принимает несколько аргументов и работает в системах, отличных от Oracle:
COALESCE(a, b, c, d)
Как насчет использования COALESCE:
COALESCE(ccvl.descr, ccc.char)
Лучше использовать COALESCE(a, b, c, d) по следующей причине:
Вложенная логика NVL может быть реализована в одном COALESCE(a, b, c, d).
Использование COALESCE является стандартом SQL.
COALESCE дает лучшую производительность в терминах, NVL всегда сначала вычисляет оба используемых запроса, а затем сравнивает, если первое значение равно нулю, а затем возвращает второе значение. но в функции COALESCE он проверяет один за другим и возвращает ответ всякий раз, когда обнаруживается ненулевое значение, вместо выполнения всех используемых запросов.