NVL2 函数
根据指定表达式的计算结果是 NULL 还是 NOT NULL 返回这两个值之一。
语法
NVL2 ( expression, not_null_return_value, null_return_value )
参数
- expression
-
一个要针对 null 状态进行计算的表达式,如列名称。
- not_null_return_value
-
在 expression 的计算结果为 NOT NULL 时返回的值。not_null_return_value 值必须具有与 expression 相同的数据类型或可隐式转换为该数据类型。
- null_return_value
-
在 expression 的计算结果为 NULL 时返回的值。null_return_value 值必须具有与 expression 相同的数据类型或可隐式转换为该数据类型。
返回类型
按以下方式确定 NVL2 返回类型:
-
如果 not_null_return_value 或 null_return_value 为 null,则返回非 null 表达式的数据类型。
如果 not_null_return_value 和 null_return_value 都不为 null:
-
如果 not_null_return_value 和 null_return_value 具有相同的数据类型,则返回该数据类型。
-
如果 not_null_return_value 和 null_return_value 具有不同的数字数据类型,则返回最小的可兼容数字数据类型。
-
如果 not_null_return_value 和 null_return_value 具有不同的日期时间数据类型,则返回时间戳数据类型。
-
如果 not_null_return_value 和 null_return_value 具有不同的字符数据类型,则返回 not_null_return_value 的数据类型。
-
如果 not_null_return_value 和 null_return_value 具有混合的数字和非数字数据类型,则返回 not_null_return_value 的数据类型。
重要
在最后两个示例中(其中返回 not_null_return_value 的数据类型),null_return_value 将隐式转换为该数据类型。如果数据类型不兼容,则该函数将失败。
使用说明
当 expression 和 search 参数均为 null 时,DECODE 函数 可以通过与 NVL2 类似的方式使用。区别在于:在 DECODE 中,返回内容将同时具有 result 参数的值和数据类型。相反,在 NVL2 中,返回内容将具有 not_null_return_value 或 null_return_value 参数的值(不管函数选择哪一个),但将具有 not_null_return_value 的数据类型。
例如,假定 column1 为 NULL,则以下查询将返回相同的值。但是,DECODE 返回值数据类型将为 INTEGER,NVL2 返回值数据类型将为 VARCHAR。
select decode(column1, null, 1234, '2345'); select nvl2(column1, '2345', 1234);
示例
以下示例修改一些示例数据,然后计算两个字段以为用户提供相应的联系人信息:
update users set email = null where firstname = 'Aphrodite' and lastname = 'Acevedo'; select (firstname + ' ' + lastname) as name, nvl2(email, email, phone) AS contact_info from users where state = 'WA' and lastname like 'A%' order by lastname, firstname; name contact_info --------------------+------------------------------------------- Aphrodite Acevedo (906) 632-4407 Caldwell Acevedo Nunc.sollicitudin@Duisac.ca Quinn Adams vel@adipiscingligulaAenean.com Kamal Aguilar quis@vulputaterisusa.com Samson Alexander hendrerit.neque@indolorFusce.ca Hall Alford ac.mattis@vitaediamProin.edu Lane Allen et.netus@risusDonec.org Xander Allison ac.facilisis.facilisis@Infaucibus.com Amaya Alvarado dui.nec.tempus@eudui.edu Vera Alvarez at.arcu.Vestibulum@pellentesque.edu Yetta Anthony enim.sit@risus.org Violet Arnold ad.litora@at.com August Ashley consectetuer.euismod@Phasellus.com Karyn Austin ipsum.primis.in@Maurisblanditenim.org Lucas Ayers at@elitpretiumet.com