常规函数用于处理数据库中的NULL值.一般NULL处理函数的目标是用备用值替换NULL值.我们将简要介绍下面这些函数.
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 ;
作为对NVL的增强,Oracle引入了一个函数,不仅可以替换NULL列值,还可以替换值也适用于NOT NULL列. NVL2函数可用于替换NULL的备用值以及非NULL值.
NVL2(string1,value_if_NOT_null,value_if_null)
如果员工的JOB_CODE为NULL,则下面的SELECT语句将显示"Bench".对于JOB CODE的明确非空值,它将显示常量值'Job Assigned'.
SQL> SELECT NVL2(JOB_CODE, 'Job Assigned', 'Bench') FROM employees;
NULLIF函数比较两个参数expr1和expr2.如果expr1和expr2相等,则返回NULL;否则,它返回expr1.与其他null处理函数不同,第一个参数不能为NULL.
NULLIF (expr1,expr2)
请注意,第一个参数可以是一个计算结果为NULL的表达式,但它不能是文字NULL.这两个参数对于函数执行都是必需的.
以下查询返回NULL,因为两个输入值都相等.
SELECT NULLIF(12,12) FROM DUAL;
同样,在查询下方返回'SUN',因为两个字符串不相等.
SELECT NULLIF('SUN','MOON') FROM DUAL;
COALESCE函数,一种更通用的NVL形式,返回参数中的第一个非null表达式名单.它至少需要两个必需参数,但最大参数没有限制.
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语句中也要强加条件.
该函数是IF..THEN..ELSE条件过程语句的SQL等价. DECODE使用所有数据类型的值/列/表达式.
DECODE(表达式,搜索,结果[,搜索,结果] ... [,默认])
DECODE函数按顺序将表达式与每个搜索值进行比较.如果表达式和搜索参数之间存在相等性,则返回相应的结果.如果不匹配,则返回默认值(如果已定义),否则为NULL.在任何类型兼容性不匹配的情况下,oracle内部可能会进行隐式转换以返回结果.
事实上,Oracle在使用DECODE函数时认为两个空值是等效的./p>
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