将NVL用于多个列 - Oracle SQL

时间:2014-07-01 03:04:24

标签: sql oracle coalesce nvl

早上好,我亲爱的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匹配则显示它。< / p>

我只是想从char_value表中返回&#39; issue&#39;的说明,但是对于&#39; email&#39;我想从lookup_value表中返回descrlong(所有这些都在同一个别名&#39; char_val&#39;下)。

所以我的问题是,如何实现这一点,请记住我希望它们出现在同一个别名下。

如果您需要任何进一步的信息,请与我们联系。

谢谢你们

3 个答案:

答案 0 :(得分:14)

你可以嵌套NVL:

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

但更好的是,使用SQL标准COALESCE,它确实需要多个参数,并且也适用于非Oracle系统:

COALESCE(a, b, c, d)

答案 1 :(得分:5)

如何使用COALESCE

COALESCE(ccvl.descr, ccc.char)

答案 2 :(得分:0)

由于以下原因,最好使用COALESCE(a,b,c,d):

  • 嵌套的NVL逻辑可以在单个COALESCE(a,b,c,d)中实现。

  • 使用COALESCE是SQL标准。

  • COALESCE可以提供更好的性能,NVL总是首先计算两个查询,然后比较第一个值是否为null并返回第二个值。但是在COALESCE函数中,它会一一检查并在发现非空值时返回响应,而不是执行所有使用过的查询。