SQL 通用函数 | NVL、NVL2、解码、合并、NULLIF、LNNVL 和 NANVL
在本文中,我们将讨论一些强大的 SQL 通用函数,它们是 NVL、NVL2、DECODE、COALESCE、NULLIF、LNNVL 和 NANVL。
这些函数适用于任何数据类型,并且适用于表达式列表中空值的使用。这些都是单行函数,即每行提供一个结果。
- NVL(expr1, expr2) :在 SQL 中,NVL() 将空值转换为实际值。可以使用的数据类型是日期、字符和数字。数据类型必须相互匹配,即 expr1 和 expr2 必须是相同的数据类型。
句法 -NVL (expr1, expr2)
expr1是可能包含空值的源值或表达式。
expr2是转换 null 的目标值。例子 -
SELECT salary, NVL(commission_pct, 0), (salary*12) + (salary*12*NVL(commission_pct, 0)) annual_salary FROM employees;
输出 :
- NVL2(expr1, expr2, expr3) :NVL2函数检查第一个表达式。如果第一个表达式不为空,则 NVL2函数返回第二个表达式。如果第一个表达式为空,则返回第三个表达式,即如果 expr1 不为空,则 NVL2 返回 expr2。如果 expr1 为空,NVL2 返回 expr3。参数 expr1 可以具有任何数据类型。
句法 -
NVL2 (expr1, expr2, expr3)
expr1是可能包含 null 的源值或表达式
expr2是 expr1 不为 null 时返回的值
expr3是 expr1 为 null 时返回的值例子 -
SELECT last_name, salary, commission_pct, NVL2(commission_pct, ’SAL+COMM’, ’SAL’) income FROM employees;
输出 :
- DECODE() :通过执行 CASE 或 IF-THEN-ELSE 语句的工作来促进条件查询。
DECODE函数以类似于各种语言中使用的 IF-THEN-ELSE 逻辑的方式对表达式进行解码。 DECODE函数在将表达式与每个搜索值进行比较后对其进行解码。如果表达式与搜索相同,则返回结果。
如果省略默认值,则在搜索值与任何结果值都不匹配时返回空值。句法 -
DECODE(col|expression, search1, result1 [, search2, result2,...,][, default])
例子 -
SELECT last_name, job_id, salary, DECODE(job_id, ’IT_PROG’, 1.10*salary, ’ST_CLERK’, 1.15*salary, ’SA_REP’, 1.20*salary,salary) REVISED_SALARY FROM employees;
输出 :
- COALESCE() :COALESCE()函数检查第一个表达式,如果第一个表达式不为空,则返回该表达式;否则,它会合并剩余的表达式。
COALESCE()函数优于 NVL()函数的优点是 COALESCE函数可以采用多个替代值。简单来说,COALESCE()函数返回列表中的第一个非空表达式。句法 -
COALESCE (expr_1, expr_2, ... expr_n)
例子 -
SELECT last_name, COALESCE(commission_pct, salary, 10) comm FROM employees ORDER BY commission_pct;
输出 :
- NULLIF() :NULLIF函数比较两个表达式。如果它们相等,则该函数返回 null。如果它们不相等,则函数返回第一个表达式。您不能为第一个表达式指定字面量NULL。
句法 -
NULLIF (expr_1, expr_2)
例子 -
SELECT LENGTH(first_name) "expr1", LENGTH(last_name) "expr2", NULLIF(LENGTH(first_name),LENGTH(last_name)) result FROM employees;
输出 :
- LNNVL() :当条件的一个或两个操作数可能为空时,LNNVL 评估条件。该函数只能在查询的 WHERE 子句中使用。它将条件作为参数,如果条件为 FALSE 或 UNKNOWN,则返回 TRUE,如果条件为 TRUE,则返回 FALSE。
句法 -
LNNVL( condition(s) )
例子 -
SELECT COUNT(*) FROM employees WHERE commission_pct < .2;
输出 :
现在上面的例子没有考虑那些根本没有佣金的员工。
为了也包括它们,我们使用 LNNVL()SELECT COUNT(*) FROM employees WHERE LNNVL(commission_pct >= .2);
输出 :
- NANVL() :NANVL函数仅对 BINARY_FLOAT 或 BINARY_DOUBLE 类型的浮点数有用。如果输入值 n1 是 NaN(不是数字),它指示数据库返回替代值 n2。如果 n1 不是 NaN,则数据库返回 n1。此函数对于将 NaN 值映射到 NULL 很有用。
句法 -
NANVL( n1 , n2 )
考虑下面名为 nanvl_demo 的表:
例子 -
SELECT bin_float, NANVL(bin_float,0) FROM nanvl_demo;
输出 :
参考资料: Oracle9i SQL 简介(Volume-1 Book)