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

 2024-01-26 03:01:26  阅读 0

之前我几次制作看板的时候,在使用case when时一直找不到合适的例子。 大多数用法是使用case when作为条件来过滤查询结果,但实际上条件或字符串表有很多。 也可以作为案例时的一种使用手段。

下面列出了以下类型:

1. 简单的 CASE WHEN 用法

这个方法是的一般用法,也是最常用的。 有两种语法,可以根据个人喜好使用:

--简单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的结果是相同的或者是char类型,否则会报类型不一致的错误。

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

例如:如果研讨会名称为“ICC AA”,则提取 2020 年的数据。否则,对于其他研讨会,将提供 2019 年的所有数据。

1.首先看一下错误的写法:

如果条件中的查询写的是,会报缺少关键字。 具体原因没查过,但一般的经验是,查询的条件字段一定要放在外面,只有结果才能放在里面。

2、如下图所示,将条件字段YEAR放在前面是正确的,时的条件结果是正确的:

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

3. CASE WHEN 作为条件语句(使用某个字段名作为条件)

之前做看板报告的时候,我被骗了。 主要原因是甲方父亲说需要录入一年中12个月各车间的数据。 每个车间只需要一条记录,每个月一栏,因为是固定12栏,所以比较简单。

结果,您遇到了麻烦,因为如果您将数据存储在列而不是行中,则将不会使用内置函数。 即使是最简单的12个月记录添加,你也无法使用。 SUM() 函数只能使用 Jun 列 + Feb 列 +... + Dec 列。 真该死的甲方……(啥?删数据库跑路?多好的主意啊)

现在表结构已经定下来了,数据也有了,我们只能硬着头皮了。 我们总不能删除别人的数据然后让他们重新维护吧?

1、我们先看一下God的表结构

2、看下面这个简单的例子:根据系统时间是哪一个月,以该月份的字段作为查询条件。

--查询当月数据是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;

但根据我目前的经验,我可以断定,无论是使用字段名作为条件,还是使用字段值作为条件,一定有一项是固定的。 也就是说,如果使用字段值作为条件,则字段名称是硬编码的。 如果使用字段名作为条件,则必须将字段值硬编码为固定值。

如果有高手可以同时使用两者作为动态值,请补充,谢谢。

4、CASE WHEN用作集合中的条件(作为非where条件中的条件)

场景:一张表有3个字段,1.时间; 2、单位; 3. 增量(时间)。

当单位为天(D)时,时间字段=时间字段+增量(增量为天);

当单位为小时(H)时,时间字段=时间字段+增量(增量为小时);

当单位为分钟(M)时,时间字段=时间字段+增量(增量为分钟);

否则,时间字段保持不变。

update 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';

5. CASE WHEN 作为字符串表条件

背景:a表和b表的字符串是以a表中的某个字段为条件的。 如果是'AG',则a表中的某个字段串是b表的一个字段,否则a表中的某个字段串是b表的另一个字段。

select *
  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;

六、总结

如果不在查询结果集中,则必须是固定结构:

标签: 字段 条件 车间

如本站内容信息有侵犯到您的权益请联系我们删除,谢谢!!


Copyright © 2020 All Rights Reserved 京ICP5741267-1号 统计代码