Welcome 微信登录

首页 / 数据库 / MySQL / Oracle函数之case和decode的用法区别及性能比较

在Oracle世界,你可以使用:1)case表达式      或者2)decode函数来实现逻辑判断。Oracle的DECODE函数功能很强,灵活运用的话可以避免多次扫描,从而提高查询的性能。而CASE是9i以后提供的语法,这个语法更加的灵活,提供了IF THEN ELSE的功能。case表达式case表达式,可分两种,简单和搜索,简单case后接表达式,如:对于简单的case需要几点注意:1)寻找when的优先级:从上到下2)再多的when,也只有一个出口,即其中有一个满足了expr就马上退出case3)不能把return_expr和else_expr指定为null,而且,expr、comparison_expr和return_expr的数据类型必须相同。搜索case:CASE WHEN condition THEN return_expr[WHEN condition THEN return_expr]...ELSE else_exprEND例子:
  1. SELECT (CASE WHEN cust_credit_limit BETWEEN  0 AND 3999 THEN  " 0 - 3999"  
  2.    WHEN cust_credit_limit BETWEEN  4000 AND 7999 THEN " 4000 - 7999"  
  3.    WHEN cust_credit_limit BETWEEN  8000 AND 11999 THEN  " 8000 - 11999"  
  4.    WHEN cust_credit_limit BETWEEN  12000 AND 16000 THEN "12000 - 16000" END)  
  5.   AS BUCKET, COUNT(*) AS Count_in_Group  
  6. FROM customers WHERE cust_city = "Marshal" GROUP BY  
  7.  (CASE WHEN cust_credit_limit BETWEEN  0 AND 3999 THEN " 0 - 3999"  
  8.  WHEN cust_credit_limit BETWEEN  4000 AND 7999 THEN " 4000 - 7999"  
  9.  WHEN cust_credit_limit BETWEEN  8000 AND 11999 THEN  " 8000 - 11999"  
  10.  WHEN cust_credit_limit BETWEEN  12000 AND 16000 THEN "12000 - 16000" END);  
  11.   
  12. BUCKET        COUNT_IN_GROUP  
  13. ------------- --------------   
  14.  0 - 3999                  8  
  15.  4000 - 7999               7  
  16.  8000 - 11999              7  
  17. 12000 - 16000              1  
用decode可以违反第3NF(行不可再分,列不可再分,列不可重复):列重复
  1. hr@ORCL> select * from a;  
  2.   
  3.         ID NAME  
  4. ---------- ----------   
  5.          1 a  
  6.          2 b  
  7.          3 c  
  8.          1 a  
  9.   
  10. hr@ORCL> select sum(decode(id,1,1,0)) think,  
  11.   2             sum(decode(id,2,2,0)) water,  
  12.   3             sum(decode(id,3,3,0)) linshuibin  
  13.   4        from a;  
  14.   
  15.      THINK      WATER LINSHUIBIN  
  16. ---------- ---------- ----------   
  17.          2          2          3  
  • 1
  • 2
  • 3
  • 下一页
undo系列学习之深入浅出事务槽undo系列学习之深入剖析一个事务的操作流程相关资讯      Oracle函数 
  • Oracle字符串函数总结  (06月20日)
  • Oracle lag()与lead() 函数  (12/01/2015 20:41:24)
  • Oracle ascii函数  (07/26/2015 08:46:01)
  • Oracle使用简单函数  (06月09日)
  • REGEXP_SUBSTR函数的整理  (08/20/2015 20:41:01)
  • Oracle dump函数  (07/26/2015 08:40:01)
本文评论 查看全部评论 (1)
表情: 姓名: 字数


评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款