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

使用decode函数相关推荐

  1. 数据库中自定义排序规则,Mysql中自定义字段排序规则,Oracle中自定义字段排序规则,decode函数的用法,field函数的用法

    数据库中自定义排序 场景:有一张banner表,表中有一个status字段,有0, 1, 2三个状态位,我想要 1,0,2的自定义排序(这里是重点),然后再进行之上对sequence字段进行二次排序( ...

  2. mysql sql decode函数用法_oracle中的decode的使用介绍

    含义解释: decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值) 该函数的含义如下: IF 条件=值1 THEN RETURN(翻译值1) ELSIF 条件=值2 THE ...

  3. oracle decode一个值对应多个值,如何使用Oracle的Decode函数进行多值判断

    Decode函数的语法结构如下: decode (expression, search_1, result_1) decode (expression, search_1, result_1, sea ...

  4. 先随机后排序的oracle,Oracle用decode函数或CASE-WHEN实现自定义排序

    Oracle用decode函数或CASE-WHEN实现自定义排序 1 问题 对SQL排序,只要在order by后面加字段就可以了,可以通过加desc或asc来选择降序或升序.但排序规则是默认的,数字 ...

  5. SQL中 decode()函数简介

    今天看别人的SQL时看这里面还有decode()函数,以前从来没接触到,上网查了一下,还挺好用的一个函数,写下来希望对朋友们有帮助哈! decode()函数简介: 主要作用:将查询结果翻译成其他值(即 ...

  6. decode函数_decode函数的妙用网友的两个问题解答

    <decode函数的妙用>这篇文章中,提到两种写法, SQL> select * from emp where id=:id and (name=:name or (name is ...

  7. decode函数python在哪里_Python基础知识——encode和decode函数

    以前我们介绍过,Python2.x中默认的编码的基础类型是unicode编码的类型,在Python3.x才转化为基于unicode的字符串. 那么我们在Python2.x的学习中就会遇到各种各样的编码 ...

  8. oracle中创建函数行变列,oracle decode 函数实现行转列

    用decode函数,或者case when实现行转列 Oracle ----创建测试表create table student_score( name varchar2(20), subject va ...

  9. python中的encode()和decode()函数

    对于很多人来说,python的中字符转码是一件很头疼的事情,本来期望结果输出的是中文,结果来一段像这样\xe4\xbd\xa0\xe5\xa5\xbd像是乱码的字符串. 由于学python没多久,昨天 ...

  10. Oracle的DECODE函数

    DECODE函数 语法格式 decode(字段或字段的运算,值1,值2,值3) 语法说明 当字段或字段的运算的值,等于值1时,该函数返回值2,否则返回值3 值1,值2,值3也可以是表达式 SELECT ...

最新文章

  1. 万字长文,别再说你不懂Linux内存管理了(合辑),30 张图给你安排的明明白白...
  2. 苹果无线耳机使用方法_安卓党可以使用 AirPods 吗?实测结果.....
  3. Android -- 消息处理机制源码分析(Looper,Handler,Message)
  4. win10系统下多python版本部署
  5. 参加web前端学习前需要知道的注意事项
  6. 十八、深入Java 访问修饰符和非访问修饰符
  7. nfc加密卡pm3和pm5区别_小米手环4/5 NFC添加加密门禁
  8. wpf(第一个应用实例)
  9. 优化在深度学习中的挑战
  10. 【LeetCode】48. Rotate Image (2 solutions)
  11. 只卖了2000辆,竟扬言吊打特斯拉!贾跃亭昔日偶像,还在忽悠?
  12. c语言删除元素1116,C语言网蓝桥杯1116 IP判断
  13. php 占位符替换_AJAX ASP / PHP实例
  14. 如何进行用户行为分析并提高用户粘性
  15. vb webbrowser html源码,VB WebBrowser控件常用源码
  16. matlab cplex使用
  17. 国开大学c语言程序设计形考任务1,国开电大《数控编程技术》形考任务1-4答案...
  18. 测绘类(遥感)投稿期刊(卓越期刊、EI、CSCD、核心期刊)汇总,内附投稿链接
  19. 软件测试——界面测试
  20. 《mysql从删库到跑路》下载

热门文章

  1. Delaunay三角化实现原理
  2. Python实战从入门到精通第十七讲——将单方法的类转换为函数
  3. 腾讯广告的多媒体AI技术实战
  4. 【TI-ONE系列教程(三)】如何使用 TI-ONE 平台内置框架玩转算法大赛
  5. 冠军奖金50万,2020腾讯广告算法大赛广发“英雄帖”
  6. data2vec!统一模态的新里程碑
  7. 利用c语言面向对象编程,用C语言程序实现面向对象编程
  8. 从四大造字法看文字所承载的文化_对央视“汉字的魅力”讲授之管见(《天津教育报》2012年6月15日)...
  9. node ajax crud,基于node.js和rethinkdb的CRUD(增删改查)Web服务
  10. ajax----serialize()方法注意事项