📜  使用条件表达式

📅  最后修改于: 2020-12-29 04:20:25             🧑  作者: Mango


一般功能

常规函数用于处理数据库中的NULL值。常规NULL处理函数的目的是将NULL值替换为备用值。我们将在下面简要介绍这些功能。

NVL

NVL函数将替代值替换为NULL值。

句法:

NVL( Arg1, replace_with )

在语法中,两个参数都是必需的。请注意,NVL函数适用于所有类型的数据类型。并且原始字符串和替换的数据类型必须处于兼容状态,即Oracle可以相同或隐式转换。

如果arg1是字符值,则oracle在比较替换字符串之前将其转换为与arg1兼容的数据类型,并在expr1字符集中返回VARCHAR2。如果arg1是数字,则Oracle确定数字优先级最高的参数,将另一个参数隐式转换为该数据类型,然后返回该数据类型。

如果尚未将员工分配给任何工作,即JOB_ID为NULL,则下面的SELECT语句将显示“ n / a”。否则,它将显示实际的JOB_ID值。

SELECT  first_name, NVL(JOB_ID, 'n/a')
FROM employees;

NVL2

作为对NVL的增强,Oracle引入了一种功能,该函数不仅可以将值替换为NULL列值,而且还可以替换为NOT NULL列。 NVL2函数可用于将替代值替换为NULL以及非NULL值。

句法:

NVL2( string1, value_if_NOT_null, value_if_null )

如果雇员的JOB_CODE为NULL,则下面的SELECT语句将显示“ Bench”。对于作业代码的确定的非空值,它将显示恒定值“作业分配”。

SQL> SELECT NVL2(JOB_CODE, 'Job Assigned', 'Bench')
FROM employees;

空IF

NULLIF函数比较两个参数expr1和expr2。如果expr1和expr2相等,则返回NULL;否则,返回NULL。否则,返回expr1。与其他null处理函数,第一个参数不能为NULL。

句法:

NULLIF (expr1, expr2)

请注意,第一个参数可以是计算结果为NULL的表达式,但不能为字面量NULL。这两个参数都是函数执行所必需的。

由于两个输入值12相等,因此以下查询返回NULL。

SELECT    NULLIF (12, 12)
FROM DUAL;

同样,在下面的查询中返回“ SUN”,因为两个字符串都不相等。

SELECT NULLIF ('SUN', 'MOON')
FROM DUAL;

合并

COALESCE函数(一种更通用的NVL形式)返回参数列表中的第一个非空表达式。它至少需要两个强制参数,但最大参数没有限制。

句法:

COALESCE (expr1, expr2, ... expr_n )

考虑下面的SELECT查询。它选择输入到雇员地址字段中的第一个非空值。

SELECT COALESCE (address1, address2, address3) Address
FROM  employees;

有趣的是,COALESCE函数的工作方式类似于IF..ELSIF..ENDIF构造。上面的查询可以重写为-

IF address1 is not null THEN
   result := address1;
ELSIF address2 is not null THEN
   result := address2;
ELSIF address3 is not null THEN
   result := address3;
ELSE
   result := null;
END IF;

条件函数

Oracle提供了条件函数DECODE和CASE甚至在SQL语句中也施加条件。

DECODE函数

该函数是IF..THEN..ELSE条件过程语句的SQL等效项。 DECODE适用于所有数据类型的值/列/表达式。

句法:

DECODE (expression, search, result [, search, result]... [, default])

DECODE函数按顺序将表达式与每个搜索值进行比较。如果expression和search参数之间存在相等,则它将返回相应的结果。如果不匹配,则返回默认值(如果已定义),否则返回NULL。如果任何类型兼容性都不匹配,则oracle在内部进行可能的隐式转换以返回结果。

实际上,在使用DECODE函数时,Oracle认为两个null是等效的。

SELECT DECODE(NULL,NULL,'EQUAL','NOT EQUAL') 
FROM DUAL;

DECOD
-----
EQUAL

如果expression为null,则Oracle返回也为null的第一个搜索结果。 DECODE函数的最大组件数为255。

SELECT    first_name, salary, DECODE (hire_date, sysdate,'NEW JOINEE','EMPLOYEE')
    FROM employees;

案例表达

CASE表达式的工作原理与DECODE相同,但是语法和用法不同。

句法:

CASE  [ expression ]
   WHEN condition_1 THEN result_1
   WHEN condition_2 THEN result_2
   ...
   WHEN condition_n THEN result_n
   ELSE result
END

Oracle搜索从左开始,然后向右移动,直到找到一个真正的条件,然后返回与其关联的结果表达式。如果没有条件为真,并且存在ELSE子句,则Oracle返回用else定义的结果。否则,Oracle返回null。

CASE表达式中的最大参数数为255。所有表达式都计入此限制,包括简单CASE表达式的初始表达式和可选的ELSE表达式。每个WHEN … THEN对均视为两个参数。为了避免超出此限制,可以嵌套CASE表达式,以便return_expr本身是CASE表达式。

SELECT first_name, CASE    WHEN salary < 200 THEN 'GRADE 1'
            WHEN salary > 200 AND salary < 5000 THEN 'GRADE 2'
            ELSE 'GRADE 3'
           END CASE
FROM employees;    

ENAM    CASE
----    -------
JOHN    GRADE 2
EDWIN   GRADE 3
KING    GRADE 1