📜  SQL 通用函数 | NVL、NVL2、解码、合并、NULLIF、LNNVL 和 NANVL

📅  最后修改于: 2022-05-13 01:55:46.561000             🧑  作者: Mango

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)