17

おはようございます、私の最愛の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| xxx@blah.com

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

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

したがって、私の質問は、同じエイリアスの下に表示することを念頭に置いて、これをどのように達成するかです。

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

みんなありがとう

4

3 に答える 3

23

NVL をネストできます。

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

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

COALESCE(a, b, c, d)
于 2014-07-01T03:06:12.710 に答える
0

以下の理由により、 COALESCE(a, b, c, d) を使用することをお勧めします。

  • ネストされた NVL ロジックは、単一の COALESCE(a、b、c、d) で実現できます。

  • COALESCE を使用するのは SQL 標準です。

  • COALESCE を使用するとパフォーマンスが向上します。NVL は常に最初に使用される両方のクエリを計算し、最初の値が null の場合は比較してから 2 番目の値を返します。ただし、COALESCE 関数では、使用されているすべてのクエリを実行する代わりに、1 つずつチェックし、null 以外の値が見つかった場合は常に応答を返します。

于 2020-06-06T04:25:30.987 に答える