【问题标题】:Using NVL for multiple columns - Oracle SQL对多列使用 NVL - Oracle SQL
【发布时间】:2014-08-21 12:29:34
【问题描述】:

早上好,我心爱的 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 表中返回“问题”的描述,但对于“电子邮件”,我想从 lookup_value 表中返回 descrlong(都在同一个别名“char_val”下)。

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

如果您需要任何进一步的信息,请告诉我。

谢谢大家

【问题讨论】:

    标签: sql oracle coalesce nvl


    【解决方案1】:

    你可以嵌套 NVL:

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

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

    COALESCE(a, b, c, d)
    

    【讨论】:

    • 谢谢。我使用了嵌套的 NVL,它非常适合我的需要。
    【解决方案2】:

    COALESCE怎么样:

    COALESCE(ccvl.descr, ccc.char)
    

    【讨论】:

      【解决方案3】:

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

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

      • 使用 COALESCE 是 SQL 标准。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-02-17
        • 1970-01-01
        • 1970-01-01
        • 2021-09-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多