[英]Using NVL for multiple columns - Oracle SQL
早上好,我亲爱的 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 表中返回'issue' 的描述,但是对于'email',我想从lookup_value 表中返回descrlong(都在同一个别名'char_val'下)。
所以我的问题是,我如何实现这一点,请记住我希望它们出现在相同的别名下。
如果您需要任何进一步的信息,请告诉我。
谢谢你们
你可以嵌套 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 函数中,它会一一检查并在发现非空值时返回响应,而不是执行所有使用过的查询。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.