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

语法

  1. 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 里面插入数据,执行以下语句:

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

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

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

查询结果如下:

  1. +-------+--------+--------+
  2. | NAME | SALARY | INCOME |
  3. +-------+--------+--------+
  4. | Bada | 2800 | 2800 |
  5. | Baer | 10000 | 10000 |
  6. | Bates | 7300 | 10147 |
  7. | Boll | 5600 | 7000 |
  8. | Broll | 4000 | 4000 |
  9. +-------+--------+--------+
  10. 5 rows in set (0.02 sec)