oracle中如何使用case和decode

分类:编程技术 时间:2024-02-20 15:25 浏览:0 评论:0
0
本期小编就来告诉大家如何在Oracle中进行用例和解码。文章内容丰富,从专业角度进行了分析和描述。希望您能通过阅读本文有所收获。

总结:

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。如果你正好有类似的疑惑,不妨参考上面的分析来了解一下。我如果您想了解更多相关知识,请关注行业资讯频道。

1. 本站所有资源来源于用户上传或网络,仅作为参考研究使用,如有侵权请邮件联系站长!
2. 本站积分货币获取途径以及用途的解读,想在本站混的好,请务必认真阅读!
3. 本站强烈打击盗版/破解等有损他人权益和违法作为,请各位会员支持正版!
4. 编程技术 > oracle中如何使用case和decode

用户评论