oracle中如何使用case和decode
总结:
DECODE与CASE WHEN的比较
1.仅DECODE仅在Oracle中可用,其他数据库不支持;
2.如何使用CASE WHEN,Oracle、SQL Server、MySQL均支持;
3.DECODE只能用于相等判断,但可以与sign函数配合使用,判断大于、小于、等于。 CASEwhen可用于=、>=、<、<=、<>、is null、is not null等判断;
4.DECODE使用它更简洁,CASE复杂但更灵活;
5. 此外,在解码,null和null相等,但万一只能通过is null来判断;解码函数还可用于将行转换为列。
1. Case表达式用法:
case when
casewhen 和我们的类似 if ...then..else ,判断语句
语法如下:
CASE expr WHEN expr1THEN return_expr1
[WHEN expr2 THEN return_expr2
...
WHEN exprn THEN return_exprn
ELSE else_expr]
END
第二个扩展用法 :
case
当 expr1 时 return_expr1
p>END
--部门编号为10时,显示为sal*1.1
--部门编号为20时,显示为sal*1.2
< span lang="zh-CN">--部门编号为30时,显示为sal*1.3
--否则显示为sal
- -该列查询的结果,列名显示为 isal
SQL> selectename,deptno,sal,case deptno 当10 thensal *1.1
2when20然后sal*1.2
3when30然后sal*1.3
4其他
5 来自 tes 的 endisalt_emp;
ENAME DEPTNO SAL ISAL
------------但p>AAAABC
史密斯 20 800960
艾伦 30 1600 2080
沃德 30 1250 1625
琼斯 20 2975 3570
>马丁 30 1250 1625
布莱克 30 2850 3705
克拉克 10 2450 2695
斯科特 20 3002 3602.4
KING 10 5000 5500
特纳 30 1500 1950
亚当斯 20 1100 1320
詹姆斯 30 950 1235
福特 20 3000 3600
MILLER 10 1300 1430
已选择 15 行。
第二种写法:
SQL> selectename,deptno,sal,case when deptno=10 thensal*1.1
2 当 deptno=20 时,然后 sal*1.2
3 当 deptno=30 时,然后 sal*1.3
4 elsesal
5 endisal from test_emp;
p>ENAME ---
AAAABC
史密斯 20 800 960
艾伦 30 1600 2080
WARD 30 1250 1625
琼斯 20 2975 3570
马丁 30 1250 1625
布莱克 30 2850 3705
克拉克 10 2450 2695
p> p>斯科特 20 3002 3602.4
KING 10 5000 5500
特纳 30 1500 1950
亚当斯 20 1100 1320
JAMES 30 950 1235
FORD 20 3000 3600
MILLER 10 1300 1430
已选择 15 行。
大小写不等式表达式的使用:
SQL> selectename,deptno,sal, case 当 sal<2000 时则 sal+200
2 当 sal 在 2000 到 3000 之间时则 sal+100
3 elsesal
4 来自 test_emp 的 Endisal;
ENAME DEPTNO SAL Isal
-------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ---------------------- ---- ----------
AAAABC
史密斯 20 800 1000
艾伦 30 1600 1800
沃德 30 1250 1450
琼斯 20 2975 3075
马丁 30 1250; 1450
布莱克 30 2850 2950
克拉克 10 2450 2550
斯科特 20 3002 3002
金 10 5000 5000
< p>特纳 30 1500 1700亚当斯 20 1100 1300
詹姆斯30 950 1150
福特 20 3000 3100
米勒 10 1300 1500< /p>
选择了 15 行。
caseused 确定 null 值并避免使用 null 函数
SQL> selectename,sal,comm,case when comm is null然后 sal elsesal+comm end isal from emp;
ENAME DEPTNO SAL ISAL
---------- /p>
史密斯 800 800
艾伦 1600 300 1900
沃德 1250 500 1750
琼斯 2975 2975
马丁 1250 1400 2650
布莱克 2850 2850
>克拉克 2450 2450
斯科特 3002 3002
金 5000 5000
特纳 1500 0 150 0
亚当斯 1100 1100< /p>
詹姆斯 950 950
福特 3000 3000
米勒 1300 -US">:
DECODE(表达式,搜索2,结果1
...
通过 If 条件 = 值 1,然后显示结果1
如果 条件=值2,则显示结果2
....
如果条件 = 值 n,则显示结果n
不满足,则显示为missing 保值
decode函数等价表达式的使用比上面case表达式的使用简单:
SQL> select ename,deptno,sal,decode(deptno,10,1.1*sal,20 , 1.2*SAL, 30,1.3*SAL) Isal from Emp;
Ename Deptno SAL Isal
-------------------------- -------------------Aaaabc
史密斯 20 800 960
艾伦 30 1600 2080
沃德 30 1250 1625
琼斯 20 2975 3570
马丁30 1250 1625
布莱克 30 2850 3705
克拉克 10 2450 2695
斯科特
ADAMS 20 1100 1320
JAMES 30 950 1235
FORD 20 3000 3600
MILLER 10 1300 1430
已选择 15 行。
注意:无法解码用于非等效用途。
扩展用法:配合使用符号函数比较大小
注意:sign()函数根据参数1的值是否为0返回0、0或0 ,分别为正数或负数 1. -1
selectename,sal,decode(sign(sal-2000),1, '>2000 ',-1, '<2000 ', '=2000 ')sal_level
来自 emp;
ENAME SAL SAL_LEVEL
---------------------------------------- ------ --------- --
史密斯 2850 > 2000
克拉克 >2000
/p>SCOTT 3000 >2000
KING5000 >2000
特纳 1500 <2000
p>ADAMS 1100 <2000
JAMES 95 0 <2000
福特 >
MILLER 1300 <2000
使用解码功能将行转换为列
SQL> selectto_char(hiredate,'yyyy') from emp;
< p>TO_C----
1980< /p>
1981年
1981年
1981年
1981年
1981年
1981年
1987年
1981年
1981年
TO_C
----
1987年
1981年
1981年
1982
选择了 15 行。
SQL> selectto_char(hiredate,'yyyy'),count(*) from emp group by to_char (hiredate,'yyyy');
TO_C COUNT(*)
---- ----------
1
1987 2
>1980 1
1982 1
1981 10
SQL>选择 sum(解码(to_char(hiredate,'yyyy'),'1980', 1))"1980",sum(解码( to_char(hiredate,'yyyy'),'1981',1))"1981",
sum(decode(to_char(hiredate,'yyyy'),'1987 ',1))"1987",sum(解码(to_char(hiredate,'yyyy'),'1982',1))"1982"from emp;
1980 1981 1987 1982
---- ------------ ---- ---------- ----------
1 10 2 1 1
1 10 2 1 1
p>
以上小编就给大家分享一下Oracle中如何使用case和decode。如果你正好有类似的疑惑,不妨参考上面的分析来了解一下。我如果您想了解更多相关知识,请关注行业资讯频道。
2. 本站积分货币获取途径以及用途的解读,想在本站混的好,请务必认真阅读!
3. 本站强烈打击盗版/破解等有损他人权益和违法作为,请各位会员支持正版!
4. 编程技术 > oracle中如何使用case和decode