云数据库OceanBase入门教程 OceanBase NVL2

2024-02-26 开发教程 云数据库OceanBase入门教程 匿名 2

NVL2函数根据表达式是否为空,返回不同的值。如果 expr1不为空,则返回 expr2的值,如果 expr1为空,则返回 expr3的值。expr2expr3类型不同的话,expr3会转换为 expr1的类型。

语法

NVL2(expr1, expr2, expr3)

参数

参数

说明

expr1

表达式。数据类型可以是 OceanBase 内建数据类型 中的任何数据类型。

expr2

表达式。数据类型可以是 OceanBase 内建数据类型中的任何数据类型。

expr3

表达式。数据类型可以是 OceanBase 内建数据类型中的任何数据类型。

如果 expr2expr3的数据类型不同,则 OceanBase 将其中一个隐式转换为另一个。 如果它们不能隐式转换,则数据库返回错误。 如果 expr2是字符或数字数据,则隐式转换规则如下:

  • 如果 expr2CHARNCHARNVARCHARVARCHAR2VARCHAR字符型数据,则 OceanBase 在返回值之前将 expr3转换为 expr2的数据类型,除非 expr3NULL。 在这种情况下,不需要数据类型转换,数据库返回 expr2字符集的 VARCHAR2

  • 如果 expr2NUMBERFLOATBINARY_FLOATBINARY_DOUBL数值型数据,则 OceanBase 确定哪个参数具有最高的数值优先级,隐式地将另一个参数转换为该数据类型,并返回该数据类型。

返回类型

如果 expr1expr2NULL,则返回 NULL。如果 expr1CHARNCHARNVARCHARVARCHAR2VARCHAR字符型数据,则返回 expr1字符集的 VARCHAR2。如果 expr1NUMBERFLOATBINARY_FLOATBINARY_DOUBLE数值型数据,则返回 expr1中具有最高数字优先级的数据类型。

示例

假设有一张表 EMPLOYEES,给员工姓名列 name、薪资列 salary 和佣金列 commission_pct 里面插入数据,执行以下语句:

CREATE TABLE EMPLOYEES (name VARCHAR(20),salary VARCHAR(20),commission_pct numeric(10,2));
INSERT INTO EMPLOYEEs VALUES ('Baer', 10000, null);
INSERT INTO EMPLOYEEs VALUES ('Bada', 2800, null);
INSERT INTO EMPLOYEEs VALUES ('Boll', 5600, .25);
INSERT INTO EMPLOYEEs VALUES ('Bates', 7300, .39);
INSERT INTO EMPLOYEEs VALUES ('Broll', 4000, null);

使用 NVL2函数查询员工的总收入。如果员工的 commission_pct 列不为空,则员工的收入为工资加佣金,否则,收入仅仅为工资。执行以下语句:

SELECT name, salary,NVL2(commission_pct, salary + (salary * commission_pct), salary) income
FROM employees WHERE name like 'B%' ORDER BY name;

查询结果如下:

+-------+--------+--------+
| NAME | SALARY | INCOME |
+-------+--------+--------+
| Bada | 2800 | 2800 |
| Baer | 10000 | 10000 |
| Bates | 7300 | 10147 |
| Boll | 5600 | 7000 |
| Broll | 4000 | 4000 |
+-------+--------+--------+
5 rows in set (0.02 sec)