Использование 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 он проверяет один за другим и возвращает ответ всякий раз, когда обнаруживается ненулевое значение, вместо выполнения всех используемых запросов.

Другие вопросы по тегам