[Oracle数据库学习]三、单行函数(3)

D2

嵌套函数

单行函数可以嵌套;

嵌套函数的执行顺序是由内向外,如下面从F1开始到F2、F3,逐层计算。

F3(F2(F1(col, arg1), arg2), arg3)
SELECT employee_name, NVL(TO_CHAR(commission_pct),'Null')
FROM employees
WHERE commission_pct IS NULL;
EMPLOYEE_NAMENVL(TO_CHAR(COMMISSION_PCT),'NULL')
Alice Null

 注:这里的NVL函数要求输入的两个参数类型相同,先执行TO_CHAR后在执行NVL。

 

通用函数

下面的函数适用于任何数据类型,包括空值。

 

NVL函数

NVL(value1, value2)

将空值转换成指定值,可以是日期、字符、数字。

这个函数的意思是如果value1的值为null,那么函数返回value2的值  ,如果value1不为空,那么就返回value1的值。

需要注意的是:value1和value2要保持字段类型相同。

注:https://blog.csdn.net/caohaicheng/article/details/14455387

SELECT employee_name, salary, 
NVL(commission_pct, 0),(salary*12) + (salary*12*NVL(commission_pct, 0)) AN_SAL FROM employees;
EMPLOYEE_NAMESALARYNVL(COMMISSION_PCT,0)AN_SAL
Alice 10000 0 120000
Bob 5000 0.12 67200
Cindy 6000 0.1 79200
Donald 4000 0.3 62400
Elsa 8000 0.12 107520

 

NVL2函数

NVL2(value1, value2, value3)

这个函数的意思是如果value1的值为null,则函数返回value3,否则函数返回value2,也就是说函数永远不会返回value1。

需要注意的是:参数value2、value3可以是除了LONG类型之外的任意数据类型。

注:https://blog.csdn.net/caohaicheng/article/details/14455387

SELECT employee_name, salary, commission_pct, NVL2(commission_pct, 'SAL+COMM', 'SAL') income
FROM employees 
WHERE job_id IN ('AM', 'PM');
EMPLOYEE_NAMESALARYCOMMISSION_PCTINCOME
Alice 10000 (null) SAL
Donald 4000 0.3 SAL+COMM

 

NULLIF函数

NULLIF(expression1, expression2)

给定两个参数expression1和expression2,如果两个参数相等,则返回NULL;否则就返回第一个参数。
等价于:

Case WHEN Expression1=Expression2 Then NULL 
        ELSE Expression1    

注:https://www.cnblogs.com/shy1766IT/p/6725581.html

SELECT employee_name, employee_id, department_id,
NULLIF(employee_id, department_id) result
FROM employees 
WHERE job_id IN ('AM', 'PM');
EMPLOYEE_NAMEEMPLOYEE_IDDEPARTMENT_IDRESULT
Alice 1 1 (null)
Donald 4 2 4

 

COALESCE函数

COALESCE(expression1, expression2, ..., expressionn)

依次参考各参数表达式,遇到非null值即停止并返回该值。如果所有的表达式都是空值,最终将返回一个空值。

SELECT employee_name, commission_pct, salary, 
COALESCE(commission_pct, salary, 10) comm
FROM employees
EMPLOYEE_NAMECOMMISSION_PCTSALARYCOMM
Cindy 0.1 6000 0.1
Bob 0.12 5000 0.12
Elsa 0.12 8000 0.12
Donald 0.3 4000 0.3
Alice (null) 10000 10000


 注:Alice的commission_pct为空,因此返回salary。

条件表达式

两种方式: CASE表达式和DECODE函数。

CASE表达式

CASE expr WHEN comparison_expr1 THEN return_expr1
        [WHEN comparison_expr2 THEN return_expr2
        WHEN comparison_exprn THEN return_exprn
        ELSE else_expr]
END

 

SELECT employee_name, job_id, salary,
CASE job_id WHEN 'DEV' THEN 1.10*salary
            WHEN 'QA' THEN 1.15*salary
            WHEN 'PM' THEN 1.20*salary
            ELSE salary 
END "REVISED_SALARY"
FROM employees;
EMPLOYEE_NAMEJOB_IDSALARYREVISED_SALARY
Alice PM 10000 12000
Bob DEV 5000 5500
Cindy QA 6000 6900
Donald AM 4000 4000
Elsa DEV 8000 8800

 

DECODE函数

DECODE(col|expression, search1, result1 
                                [, search2, result2,...,]
                                [, default])                    
SELECT employee_name, salary,
DECODE (TRUNC(salary/2000, 0),0, 0.00,
        1, 0.09,
        2, 0.20,
        3, 0.30,
        4, 0.40,
        5, 0.42,
        6, 0.44,
        0.45) TAX_RATE
FROM employees
WHERE department_id = 1;
EMPLOYEE_NAMESALARYTAX_RATE
Alice 10000 0.42
Bob 5000 0.2

decode函数的两种形式

第一种形式:

decode(条件,值1,返回值1,值2,返回值2,…值n,返回值n,缺省值)

该函数的含义如下:

IF 条件=值1 THEN
    RETURN(返回值1)
ELSIF 条件=值2 THEN
    RETURN(返回值2)
    ......
ELSIF 条件=值n THEN
    RETURN(返回值n)
ELSE
    RETURN(缺省值)
END IF

第二种形式

decode(字段或字段的运算,值1,值2,值3)

这个函数运行的结果是:当字段或字段的运算的值等于值1时,该函数返回值2,否则返回值3。
当然,值1、值2、值3也可以是表达式,这个函数使得某些sql语句简单了许多。
————————————————
注:

版权声明:本文为CSDN博主「qichangjian」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qichangjian/java/article/details/88975499

 

第一种形式:

SELECT employee_name, job_id, salary,
DECODE(job_id, 'DEV', 1.10*salary,
               'QA', 1.15*salary,
               'PM', 1.20*salary,
               salary) REVISED_SALARY
FROM employees;
EMPLOYEE_NAMEJOB_IDSALARYREVISED_SALARY
Alice PM 10000 12000
Bob DEV 5000 5500
Cindy QA 6000 6900
Donald AM 4000 4000
Elsa DEV 8000 8800

注:job_id需要为varchar,不能是char。

第二种形式:

SELECT employee_name, job_id, salary,
DECODE(job_id, 'DEV', 1.10*salary, salary) REVISED_SALARY
FROM employees;
EMPLOYEE_NAMEJOB_IDSALARYREVISED_SALARY
Alice PM 10000 10000
Bob DEV 5000 5500
Cindy QA 6000 6000
Donald AM 4000 4000
Elsa DEV 8000 8800

 

总结:

本节介绍了嵌套函数、通用函数和条件表达式。

1)嵌套函数:单行函数可以嵌套,执行从内到外;

2)通用函数:NVL、NVL2、NULLIF、COALESCE;

3)条件表达式:CASE、DECODE。

 

posted @ 2020-07-10 11:01  workingdiary  阅读(164)  评论(0)    收藏  举报