ORACLE的CASE WHEN以不同列作为条件查询 |
您所在的位置:网站首页 › oracle查询结果作为查询字段的方法 › ORACLE的CASE WHEN以不同列作为条件查询 |
之前好几次做看板的时候,在使用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 |