ORACLE的CASE WHEN以不同列作为条件查询

您所在的位置:网站首页 oracle查询结果作为查询字段的方法 ORACLE的CASE WHEN以不同列作为条件查询

ORACLE的CASE WHEN以不同列作为条件查询

2024-07-12 04:51| 来源: 网络整理| 查看: 265

之前好几次做看板的时候,在使用ORACLE的case when时,一直找不到合适的例子,大多数的用法都是对查询的结果以case when 作为条件筛选,但是实际上很多条件或者串表的地方也是可以用到case when作为使用的手段的。 以下就罗列以下使用的类型:

一.简单CASE WHEN 的用法

此方法是case when的一般用法,平常也是用的最多的,有2种语法,凭个人喜好使用:

123456789101112131415--简单Case函数 select CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女' ELSE '其他' END as "性别" from dual; --Case搜索函数 select CASE WHEN sex = '1' THEN '男' WHEN sex = '2' THEN '女' ELSE '其他' END as "性别" from dual;

然后需要注意的是查询出来的类型,保证不同的then结果都是统一number或者char类型,否则会报类型不一致错误。

二.CASE WHEN 作为条件语句(以某个字段的结果作为条件)

举例:如果车间名称叫做’ICC AA’的,就把2020年的数据拉出来来,否则其他车间,全部只要2019年的数据。 1.先看下以错误写法: 以case when 作为查询的写法写在条件中,会报缺少关键字,具体原因没查过,但是总结的经验就是,查询的条件字段都必须放在case when外面,case when 中只能放结果。

2.如下图,将条件字段YEAR放在前面,条件结果放在case when 里面就正确了:

12345678select *       from table_name      where column_name1= case              when column_name2= 'ICC AA' then               2020              else               2019            end;

三.CASE WHEN 作为条件语句(以某个字段名作为条件)

之前做看板报表的时候,被坑了一把,主要是甲方爸爸说需要录入每个车间一年12个月的数据,每个车间只需要一条记录就好了,每个月一列,因为是固定12列,所以比较简单。 结果就把自己坑惨了,因为如果以列存数据,而不是以行存数据,会导致oracle自带的函数都用不上,即使是最简单的12个月的记录相加,你居然不能用SUM()函数,只能Jun列+Feb列+…+Dec列。所以天杀的甲方…(什么?删库跑路?好主意) 既然表结构都已经定死了,数据也都有了,只能硬着头皮上啊,总不能把人家的数据删了,让人家重新维护是吧? 1.先看下天杀的表结构 2.看下面简单例子:根据系统时间在哪个月,就以哪个月的字段最为查询条件。

1234567891011121314151617--查询当月数据是0的数据(月份不是行,是列名) select * from table_name where 0 = case               when to_char(sysdate, 'MM')='01' then JAN             when to_char(sysdate, 'MM')='02' then FEB             when to_char(sysdate, 'MM')='03' then MAR             when to_char(sysdate, 'MM')='04' then APR             when to_char(sysdate, 'MM')='05' then MAY             when to_char(sysdate, 'MM')='06' then JUN             when to_char(sysdate, 'MM')='07' then JUL             when to_char(sysdate, 'MM')='08' then AUG             when to_char(sysdate, 'MM')='09' then SEP             when to_char(sysdate, 'MM')='10' then OCT             when to_char(sysdate, 'MM')='11' then NOV             else DEC             end;

但是目前根据我的经验总结得到,不管是以字段名作为条件,还是以字段值作为条件,必定是有一项是固定不动的。即如果以字段值为条件,则字段名是固定写死的,如果以字段名作为条件,那字段的值必须作为固定值写死。 如果有大神可以2个都作为动态值,请补充,谢谢。

四.CASE WHEN 在UPDATE的set中作为条件(非where条件中作为条件)

情景:某表有3个字段,1.时间;2.单位;3.增加量(时间)。 当单位是天(D)时,update时间字段=时间字段+增加量(增加量为天); 当单位是小时(H)时,update时间字段=时间字段+增加量(增加量为小时); 当单位是分钟(M)时,update时间字段=时间字段+增加量(增加量为分钟); 其他情况,时间字段不变。

123456789101112update agent_config        set NEXT_RUN_TIME=            case when RUN_UOM='D' then--单位:天                 to_date(NEXT_RUN_TIME,'yyyy/mm/dd hh24:mi:ss')+ RUN_INTERVAL             when RUN_UOM='H' then--单位:时                 to_date(NEXT_RUN_TIME,'yyyy/mm/dd hh24:mi:ss')+ (RUN_INTERVAL/24)             when RUN_UOM='M' then--单位:分                 to_date(NEXT_RUN_TIME,'yyyy/mm/dd hh24:mi:ss')+ (RUN_INTERVAL/(24*60))            else--其他情况                 NEXT_RUN_TIME            end       where FUNCTION_NAME='KB'; 五.CASE WHEN 作为串表条件

背景:a表和b 表串,根据a表中的某个字段作为条件,如果是‘AG’,则a表中的某个字段串b表的一个字段,否则a表中的某个字段串b表的另外一个字段。

1234567891011select *   from table_name1 a   LEFT JOIN table_name2 b     on a.column_name1 = b.column_name1    and a.column_name2 = case          when a.column_name3 = 'AG' then           b.column_name2  --如果a.column_name3类型是'AG',则a.column_name2字段与b.column_name2串          else           b.column_name22 --如果a.column_name3类型非'AG',则a.column_name2字段与b.column_name22串        end  where a.date_time > sysdate - 365;

六.总结

case when 如果不是在查询结果集中,肯定是一个固定的结构:



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3