使用decode函数

使用decode函数Decode函数使用:Oracle的decode函数蛮有意思,是oracle独有的,国际标准SQL中并没有decode函数。语法DECODE(col|expression,search1,result1[,search2,result2,…,][,default])例子SELECTproduct_id,DECODE(warehouse_id,1…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

Decode函数使用:

Oracle 的decode函数蛮有意思,是oracle独有的,国际标准SQL中并没有decode函数。

语法

DECODE(col|expression, search1, result1

[, search2, result2,…,]

[, default])

例子

SELECT product_id,

DECODE (warehouse_id, 1, ‘Southlake’,

2, ‘San Francisco’,

3, ‘New Jersey’,

4, ‘Seattle’,

‘Non domestic’) “Location”

FROM inventories

WHERE product_id < 1775

ORDER BY product_id, “Location”;

从上面简单的语法和例子中可以看出decode函数也可以做判断,可以实现case…when…then…else..end 和 if..then..else..end if 同样的功能。

Decode函数优点:

1、  使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表,从而减少数据处理时间

例如:想要统计scott用户下emp表中部门20和部门30各有多少员工,每个部门工资成本。

 

 SELECT COUNT(*),

          SUM(SAL) FROM EMP WHERE DEPTNO = 20;

   SELECT COUNT(*),

          SUM(SAL) FROM EMP WHERE DEPTNO = 30;

上面的语句可以合并成一条可以达到同样的目的

SELECT COUNT(DECODE(DEPTNO,20,’X’,NULL)) D20_COUNT,

        COUNT(DECODE(DEPTNO,30,’X’,NULL)) D30_COUNT,

        SUM(DECODE(DEPTNO,20,SAL,NULL)) D20_SAL,

        SUM(DECODE(DEPTNO,30,SAL,NULL)) D30_SAL

FROM EMP;

2、  简化了代码

上面的例子如果使用case when 来实现写起来会多写一些代码

SELECT product_id,

Case warehouse_id

    When 1 then ‘Southlake’

    When 2 then ‘San Francisco’

         When 3 then ‘New Jersey’

         When 4 then ‘Seattle’

           Else  ‘Non domestic’

 End as “Location”

FROM inventories

WHERE product_id < 1775

ORDER BY product_id, “Location”;

建议:如果只是简单的判断使用decode函数简单明了

Decode函数性能对比case when性能

  If..then..end if是一种落后的判断方式,这里不做对比了。

经常在网上看到说使用某个函数或者某种写法效率怎么怎么高,执行效率如何还是得具体测试:

SQL> CREATE TABLE T AS
2 SELECT A.*
3 FROM DBA_OBJECTS A, DBA_MVIEWS;

Table created.

SQL> SELECT COUNT(*) FROM T;

COUNT(*)
———-
6075760

下面检查DECODE和两种CASE语句的效率:

SQL> SET ARRAY 1000
SQL> SET TIMING ON
SQL> SET AUTOT TRACE
SQL> SELECT DECODE(OWNER, ‘SYSTEM’, ‘SYSTEM’, ‘SYS’, ‘SYSTEM’, ‘USER’)
2 FROM T;

6075760 rows selected.

Elapsed: 00:00:07.24

Execution Plan
———————————————————-
Plan hash value: 1601196873

————————————————————————–
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
————————————————————————–
| 0 | SELECT STATEMENT | | 4245K| 68M| 13828 (1)| 00:03:14 |
| 1 | TABLE ACCESS FULL| T | 4245K| 68M| 13828 (1)| 00:03:14 |
————————————————————————–

Note
—–
– dynamic sampling used for this statement

Statistics
———————————————————-
0 recursive calls
0 db block gets
47551 consistent gets
0 physical reads
0 redo size
46288564 bytes sent via SQL*Net to client
67317 bytes received via SQL*Net from client
6077 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
6075760 rows processed

SQL> SELECT CASE OWNER WHEN ‘SYSTEM’ THEN ‘SYSTEM’
2 WHEN ‘SYS’ THEN ‘SYSTEM’
3 ELSE ‘USER’ END
4 FROM T;

6075760 rows selected.

Elapsed: 00:00:07.22

Execution Plan
———————————————————-
Plan hash value: 1601196873

————————————————————————–
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
————————————————————————–
| 0 | SELECT STATEMENT | | 4245K| 68M| 13828 (1)| 00:03:14 |
| 1 | TABLE ACCESS FULL| T | 4245K| 68M| 13828 (1)| 00:03:14 |
————————————————————————–

Note
—–
– dynamic sampling used for this statement

Statistics
———————————————————-
0 recursive calls
0 db block gets
47551 consistent gets
0 physical reads
0 redo size
46288578 bytes sent via SQL*Net to client
67317 bytes received via SQL*Net from client
6077 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
6075760 rows processed

SQL> SELECT CASE WHEN OWNER = ‘SYSTEM’ THEN ‘SYSTEM’
2 WHEN OWNER = ‘SYS’ THEN ‘SYSTEM’
3 ELSE ‘USER’ END
4 FROM T;

6075760 rows selected.

Elapsed: 00:00:07.23

Execution Plan
———————————————————-
Plan hash value: 1601196873

————————————————————————–
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
————————————————————————–
| 0 | SELECT STATEMENT | | 4245K| 68M| 13828 (1)| 00:03:14 |
| 1 | TABLE ACCESS FULL| T | 4245K| 68M| 13828 (1)| 00:03:14 |
————————————————————————–

Note
—–
– dynamic sampling used for this statement

Statistics
———————————————————-
0 recursive calls
0 db block gets
47551 consistent gets
0 physical reads
0 redo size
46288585 bytes sent via SQL*Net to client
67317 bytes received via SQL*Net from client
6077 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
6075760 rows processed

测试结果是CASE的简单表达式写法效率最高,然后是CASE的另一种写法,DECODE效率最低。但是对于600W的记录,最终结果只有0.01到0.02秒的查询,实在没有办法得出上面的结论,因为这个差别实在是太小,以至于任何其他的一些影响都足以改变测试结果,如要一定要得出结论,那么结论就是3种方式的效率基本相同。

不过由于CASE表达式更加灵活,使得以前DECODE必须运用的一些技巧得以简化,这时使用CASE方式,确实可以得到一些性能上的提高,比如:

SQL> SELECT DECODE(SIGN(OBJECT_ID), 1, ‘+’, -1, ‘-‘, ‘0’)
2 FROM T;

6075760 rows selected.

Elapsed: 00:00:04.94

Execution Plan
———————————————————-
Plan hash value: 1601196873

————————————————————————–
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
————————————————————————–
| 0 | SELECT STATEMENT | | 4245K| 52M| 13840 (1)| 00:03:14 |
| 1 | TABLE ACCESS FULL| T | 4245K| 52M| 13840 (1)| 00:03:14 |
————————————————————————–

Note
—–
– dynamic sampling used for this statement

Statistics
———————————————————-
0 recursive calls
0 db block gets
47551 consistent gets
0 physical reads
0 redo size
31491431 bytes sent via SQL*Net to client
67317 bytes received via SQL*Net from client
6077 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
6075760 rows processed

SQL> SELECT CASE WHEN OBJECT_ID > 0 THEN ‘+’
2 WHEN OBJECT_ID < 0 THEN ‘-‘
3 ELSE ‘0’ END
4 FROM T;

6075760 rows selected.

Elapsed: 00:00:04.60

Execution Plan
———————————————————-
Plan hash value: 1601196873

————————————————————————–
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
————————————————————————–
| 0 | SELECT STATEMENT | | 4245K| 52M| 13840 (1)| 00:03:14 |
| 1 | TABLE ACCESS FULL| T | 4245K| 52M| 13840 (1)| 00:03:14 |
————————————————————————–

Note
—–
– dynamic sampling used for this statement

Statistics
———————————————————-
0 recursive calls
0 db block gets
47551 consistent gets
0 physical reads
0 redo size
31491449 bytes sent via SQL*Net to client
67317 bytes received via SQL*Net from client
6077 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
6075760 rows processed

这里CASE带来性能提升的主要原因实际上是CASE避免了SIGN函数的调用,而并不是CASE本身的性能要高于DECODE,事实上如果这里使用SIGN并利用CASE的所谓高效语法:

SQL> SELECT CASE SIGN(OBJECT_ID) WHEN 1 THEN ‘+’
2 WHEN -1 THEN ‘-‘
3 ELSE ‘0’ END
4 FROM T;

6075760 rows selected.

Elapsed: 00:00:04.97

Execution Plan
———————————————————-
Plan hash value: 1601196873

————————————————————————–
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
————————————————————————–
| 0 | SELECT STATEMENT | | 4245K| 52M| 13840 (1)| 00:03:14 |
| 1 | TABLE ACCESS FULL| T | 4245K| 52M| 13840 (1)| 00:03:14 |
————————————————————————–

Note
—–
– dynamic sampling used for this statement

Statistics
———————————————————-
0 recursive calls
0 db block gets
47551 consistent gets
0 physical reads
0 redo size
31491445 bytes sent via SQL*Net to client
67317 bytes received via SQL*Net from client
6077 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
6075760 rows processed

可以看到,这时效率比DECODE还低。

 

总结

 

1、  case语句和decode函数执行效率方面

无论是DECODE还是CASE方式的两种写法,执行效率没有明显的差别。

2、  代码实现方面

使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表,从而减少数据处理时间。

如果只是简单的判断使用decode函数简单明了。

 

以上文档测试并整理自互联网

官方参考文档:

Oracle® Database

SQL Language Reference

11g Release 2 (11.2)

E17118-04

5 FUNCTIONSàDECODE

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/160072.html原文链接:https://javaforall.net

(0)
上一篇 2022年7月25日 下午5:00
下一篇 2022年7月25日 下午5:00


相关推荐

  • win10封装系统(sc封装)

    大家都知道Win10系统是微软最新发布的具有划时代意义的新一代操作系统,担负着振兴微软的大任,凭借卓越的性能和流畅的用户体验赢得了广大用户的认可和信任,市场占有率那是芝麻开花节节高啊,不过作为装机维修的技术员同行们肯定想知道如何封装Win10操作系统,从而为我们的日常装机工作带来便利,不过据爱学府软件园了解到目前网络上几乎找不到比较详细好用且具备学习价值的Win10系统封装教程,针对这一问…

    2022年4月13日
    87
  • 研究生小论文投稿_研究生个人总结怎么写

    研究生小论文投稿_研究生个人总结怎么写我是2014级研究生,学校只是一个普通211,而且工科很弱,导师对我是放养,让我回忆下,上学期就见过她一次,而且她快退休了,没项目没经费没权利,但我觉得跟着她还挺好,因为我可以自己研究自己喜欢的,没人妨碍。但同时导师没有基金,所以我的小论文都没有基金可挂。我本身的研究方向自己选的是:鱼眼图像校正、图像拼接、融合,全景漫游。我毕业论文也准备写这个方向,因为挺喜欢,虽然没研究多久。我毕业论文并没有想

    2025年9月5日
    7
  • [转载]对于WebGrid第三方控件的使用「建议收藏」

    [转载]对于WebGrid第三方控件的使用「建议收藏」[转载]对于WebGrid第三方控件的使用最近碰到关于WebGrid第三方控件的使用,查了一下资料不是很多,找到一篇较好博客,拿出来分享!博客文章:WebGrid的用法原文链接:http://ding20688.iteye.com/blog/1136582原文如下:首先安装Infragistics.NetAdvantage.for.ASP…

    2026年4月14日
    4
  • TFS(Team Foundation Server)介绍和入门

    TFS(Team Foundation Server)介绍和入门

    2021年11月14日
    52
  • Ajax练手小案例

    Ajax练手小案例一、Ajax介绍1、Ajax不是一项具体的技术,而是几门技术的综合应用。Javascript、XHTML和CSS、DOM、XML和XMLHttpRequest。2、Ajax核心只不过是要在javascript中调用一个叫XMLHttpRequest类,这个类可以与Web服务器使用HTTP协议进行交互,程序不通过浏览器发出请求,而是用这个特殊的JavaScript对象发送请求和接收…

    2022年6月13日
    21
  • E: Sub-process /usr/bin/dpkg returned an error code (1)解决办法

    E: Sub-process /usr/bin/dpkg returned an error code (1)解决办法E:Sub-process/usr/bin/dpkgreturnedanerrorcode(1)解决办法安装libapache2-svn出现了这个错误,是由于apt-get安装软件时出现了类似于:dpkg:errorprocessingpackagelibapache2-mod-svn(–configure):subprocessinstalledpost-i…

    2025年7月24日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号