web-dev-qa-db-ja.com

複数の列でのNVLの使用-Oracle SQL

おはよう、私の最愛のSQLウィザードと魔術師、

3つのテーブルにまたがる3列のデータを代入したいと考えています。現在NVL関数を使用していますが、これは2列に制限されています。

以下の例をご覧ください。

    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| [email protected]

基本的に私がやろうとしているのは、lookup_value.descrとcase_char.valueが一致する場合はそれを表示し、そうでない場合は、case_char.valueとchar_value.charが一致する場合はそれを表示することです。

Char_valueテーブルから 'issue'の説明を返そうとしていますが、 'email'の場合、lookup_valueテーブルからdescrlongを返します(すべて同じエイリアス 'char_val'の下にあります)。

だから私の質問は、同じエイリアスの下にそれらを表示したいということを心に留めて、どうやってこれを達成するのですか?.

さらに情報が必要な場合はお知らせください。

みんなありがとう

14
Heisenberg

NVLをネストできます:

 NVL(a, NVL(b, NVL(c, d))

しかし、さらに良いのは、SQL標準 [〜#〜] coalesce [〜#〜] を使用することです。これは複数の引数を取り、Oracle以外のシステムでも機能します。

COALESCE(a, b, c, d)
17
Thilo

[〜#〜] coalesce [〜#〜] を使用するのはどうですか?

COALESCE(ccvl.descr, ccc.char)
6
Linger