`
mikixiyou
  • 浏览: 1098658 次
  • 性别: Icon_minigender_1
  • 来自: 南京
博客专栏
C3c8d188-c0ab-3396-821d-b68331e21226
Oracle管理和开发
浏览量:353047
社区版块
存档分类
最新评论

select子句中case end和decode函数的使用

阅读更多

如果要在Oracle数据库的select子句中实现字段值的大小比较,可以使用case end和decode函数实现。
例如,查询出某个表的3个小时以上的处理统计数据,2个小时以内的处理统计数据,1个小时以内的处理统计数据的SQL语句。

使用case end函数可以实现如下:

select t.custommgrid,
       count(case
               when (t.createtime - t.firstdealtime) >= 3 / 24 then
                t.dealflag
               else
                null
             end) as threehour_things,
       count(case
               when (t.createtime - t.firstdealtime) < 2 / 24 then
                t.dealflag
               else
                null
             end) as twohour_things,
       count(case
               when (t.createtime - t.firstdealtime) < 1 / 24 then
                t.dealflag
               else
                null
             end) as onehour_things,
       count(t.dealflag) as all_things
  from tb_name t
 where t.dealflag = 1
 group by t.custommgrid;

 
使用decode函数可以实现如下:

select count(decode(sign((t.createtime - t.firstdealtime) - 3 / 24),
                    -1,
                    null,
                    t.dealflag)) as threehour_things,
       count(decode(sign((t.createtime - t.firstdealtime) - 2 / 24),
                    -1,
                    t.dealflag,
                    null)) as twohour_things,
       count(decode(sign((t.createtime - t.firstdealtime) - 1 / 24),
                    -1,
                    t.dealflag,
                    null)) as onehour_things,
       count(t.dealflag) as all_things
  from tb_name t
 where t.dealflag = 1
 group by t.custommgrid;

 

 decode(条件,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值)
  该函数的实现逻辑是这样:
  IF 条件=值1 THEN
  RETURN(翻译值1)
  ELSIF 条件=值2 THEN
  RETURN(翻译值2)  ......
  ELSIF 条件=值n THEN
  RETURN(翻译值n)
  ELSE
  RETURN(缺省值)
  END IF

 

(miki西游 @mikixiyou 原文链接: http://mikixiyou.iteye.com/blog/1716817 )


使用case end可以直接得出比较值,大小一清二楚;而使用decode要使用sign可以一次转换,增加了一弯来绕。这是因为decode函数只能做等值比较。

因此,对于此类需求,最好还是使用case end来实现。

 

 

 

分享到:
评论
1 楼 jz20110918 2013-03-22  
一直保留着看帖回复的良好习惯,所以看完此贴总结,感觉很有裨益。

相关推荐

    Oracle用decode函数或CASE-WHEN实现自定义排序

    在Oracle数据库中,进行SQL查询时,我们通常使用`ORDER BY`子句对查询结果进行排序。然而,标准的`ORDER BY`语句遵循数据库默认的排序规则,这可能不满足某些特定的需求。例如,当你需要按照特定顺序(如自定义的...

    数据库基础 高级sql编程

    在高级 SQL 编程中,Case 与 Decode 是两个非常有用的函数,它们能够极大地提高数据处理能力和查询效率。 高级 SQL 编程在数据库开发技术中扮演着非常重要的角色,它能够极大地提高数据库的查询效率和数据处理能力...

    在employees表中查询出员工的工资,并计算应交税款

    根据提供的文件信息,本文将详细解释如何在...使用CASE语句和DECODE函数都是解决这类问题的好方法,具体选择哪一种取决于实际需求和个人喜好。希望这篇文章能帮助你更好地理解和掌握如何在Oracle数据库中处理此类问题。

    oracle_sql使用.docx

    首先,当你在查询中使用组函数如MAX时,根据SQL标准,所有非组函数的列都必须在GROUP BY子句中指定。这意味着如果你有一个SELECT语句,其中包含MAX函数,但没有在GROUP BY子句中包含其他列,你会收到错误。例如,...

    Oracle_case_when_用法

    `CASE WHEN` 与 `DECODE()` 函数相似,但因其符合 ANSI 标准而更受推荐使用。 #### 二、基本结构 `CASE WHEN` 语句的基本结构如下: ```sql CASE WHEN condition1 THEN result1 WHEN condition2 THEN result2 ...

    编程学习笔记(数据库,C#)

    总结来说,DECODE函数提供了灵活的条件判断和返回值处理,SUBSTR函数帮助我们从字符串中提取部分信息,而正则表达式则是文本处理的利器,它们都是编程学习中不可或缺的知识点,尤其是在数据库和C#编程中。...

    Oracle面试题及答案整理.docx

    在这个问题中,我们可以使用 CASE 语句和 SUM 函数来计算每种员工的数量。CASE 语句可以根据不同的条件返回不同的值,而 SUM 函数可以将这些值相加以计算总数。在这个问题中,我们可以使用以下 SQL 语句: ```sql ...

    DB2、ORACLE

    - Oracle的DECODE函数在DB2中不支持,可以使用CASE WHEN语句替代,如`SELECT CASE WHEN f_areaid IS NULL THEN '空' ELSE f_areaid END FROM masa_user`。 7. **NVL函数**: - Oracle的NVL在DB2中需要使用...

    Oracle经典练习

    #### 十一、使用CASE和DECODE函数显示员工所在的部门 - **SQL语句**: ```sql -- 使用CASE select ename, case deptno when 10 then '部门10' when 20 then '部门20' when 30 then '部门30' when 40 then '部门40...

    MLDN魔乐科技JAVA培训_Oracle课堂6_排序、单行函数.rar

    6. **其他函数**:DECODE()根据条件返回不同值,CASE或CASE WHEN...END用于条件表达式,以及ROWNUM用于生成行号。 这堂课程可能详细讲解了如何在Java程序中与Oracle数据库交互,如何编写SQL语句进行排序操作,以及...

    学习oracle笔记(word版本)

    9. **FOR UPDATE子句**:在SELECT语句中使用FOR UPDATE,可以锁定查询到的行,以便在事务中进行更新。这样可以确保其他用户在事务完成前无法修改这些行。 10. **DECLARE声明**:在PL/SQL块的开始,DECLARE关键字...

    oracle case when 语句的用法详解

    综上所述,Oracle的CASE WHEN语句是数据库查询中处理条件分支的重要工具,可以在SELECT、WHERE和GROUP BY等不同场景中使用,提供了一种灵活的方式来构造复杂的逻辑判断。了解并熟练运用CASE WHEN,能够显著提升SQL...

    oracle 优化语句

    在`SELECT`子句中使用`*`会使得Oracle在解析过程中将`*`转换成所有的列名,这个过程是通过查询数据字典完成的,会消耗额外的时间。为了避免这种情况,应当明确指定所需的列名。 #### 四、减少访问数据库的次数 ...

    Oracle经典练习题及标准答案

    - **题目示例**:分别用CASE和DECODE函数列出员工所在的部门。 - **SQL语句**: ```sql select ename, case deptno when 10 then '部门10' when 20 then '部门20' when 30 then '部门30' when 40 then '部门...

    sql经典 oracle的查询结果的行列互换

    本文详细介绍了如何在 Oracle 数据库中实现数据的行列互换操作,分别使用了 `UNION`、`CASE` 以及 `DECODE` 函数等方法。每种方法都有其适用场景,具体选择哪种取决于实际需求和个人偏好。希望本文能够帮助你在实际...

    oracle面试试题

    - **子查询**:外层查询中使用内层查询的结果作为条件。这里使用子查询来先找到满足条件的`FID`。 - **DISTINCT 关键字**:用于去除重复的值。 - **HAVING 子句**:用于过滤GROUP BY后的结果集,类似于WHERE子句但...

    ORACLE转DB2对照全解

    集合是用于存储多个元素的数据结构,常用于存储过程和函数中。 ##### 4.1 批量集合 **Oracle:** ```sql TYPE t1 IS TABLE OF NUMBER INDEX BY PLS_INTEGER; t1_tab t1; ``` **DB2:** ```sql DECLARE t1_tab ...

    oracle转DB2 对照

    - 注意点: DB2中没有直接对应的函数,但可以使用 `CASE` 语句实现相同功能。 #### 13. Rownum - **Oracle** 支持 `ROWNUM` 来限制结果集中的行数。 - Oracle示例: ```sql SELECT * FROM (SELECT column, ROWNUM...

Global site tag (gtag.js) - Google Analytics