【问题标题】:CASE statement in WHERE clause to look for multiple values using INWHERE 子句中的 CASE 语句使用 IN 查找多个值
【发布时间】:2020-12-07 16:26:40
【问题描述】:

我希望编写一条 SQL 语句来根据一周中的当前日期报告不同的轮次。

因此,如果当天是星期一,我希望报告显示有关“NOMN”、“EWM1”、“EWM2”和“SOMN”轮次的信息 - 但如果当天是星期二,我希望报告显示我在周三、周四、周五轮换 'NOTE'、'EWT1'、'EWT2'、'SOTE' 等等。

当前代码如下

   SELECT
   insp_route_feat.insp_route_code,
   insp_route_feat.site_code,
   insp_route_feat.plot_number,
   insp_route_feat.officer_code,
   max (inspection_feature.feature_insp_date) as Last_Inspection_Date,

   case
   when  max (inspection_feature.feature_insp_date) >=trunc(SYSDATE,'DD') then 'Inspected'
   else 'Not Completed' end as Assigned


   FROM
   insp_route_feat
   inner join inspection_feature on insp_route_feat.site_code = inspection_feature.site_code and 
   insp_route_feat.plot_number = inspection_feature.plot_number


   WHERE  insp_route_feat.insp_route_code = 
   (CASE WHEN to_char(sysdate,'DY') = 'MON' THEN 'NOMN'
           WHEN to_char(sysdate,'D') = 'TUE' THEN 'NOTE'
                        ELSE null END)

   group by
   insp_route_feat.insp_route_code,
   insp_route_feat.site_code,
   insp_route_feat.plot_number,
   insp_route_feat.officer_code

我希望 WHERE 语句说的是类似

WHERE  insp_route_feat.insp_route_code IN ( 
   (CASE WHEN to_char(sysdate,'DY') = 'MON' THEN 'NOMN','EWM1','EWM2','SOMN'
           WHEN to_char(sysdate,'D') = 'TUE' THEN 'NOTE','EWT2','EWT2','SOTE'
                        ELSE null END)

但是我知道编码是错误的,但希望这能让我知道我在追求什么。

【问题讨论】:

    标签: sql oracle case where-clause


    【解决方案1】:

    布尔逻辑比case 表达式更容易表达这样的逻辑:

    WHERE (to_char(sysdate,'DY') = 'MON' and insp_route_feat.insp_route_code IN ('NOMN','EWM1','EWM2','SOMN'))
       OR (to_char(sysdate,'DY') = 'TUE' and insp_route_feat.insp_route_code IN ('NOTE','EWT2','EWT2','SOTE'))
    

    【讨论】:

      【解决方案2】:

      只需使用布尔表达式:

      WHERE ( to_char(sysdate, 'DY') = 'MON' and 
              insp_route_feat.insp_route_code IN ('NOMN', 'EWM1', 'EWM2', 'SOMN')
            ) OR
            ( to_char(sysdate, 'DY') = 'TUE' and 
              insp_route_feat.insp_route_code IN ('NOTE', 'EWT2', 'EWT2', 'SOTE')
            )
      

      CASE 表达式在 WHERE 子句中很少需要。请注意,我还修复了第二个条件以使用 'DY' 而不是 'D'

      【讨论】:

        【解决方案3】:

        是的,布尔表达式使它更容易,但如果你想在where 子句中使用case when 语句,那么有一个选项如下:

        CASE
          WHEN to_char(sysdate, 'DY') = 'MON' 
               and insp_route_feat.insp_route_code IN ('NOMN', 'EWM1', 'EWM2', 'SOMN') 
          THEN 1
          WHEN to_char(sysdate, 'DY') = 'TUE' 
               and insp_route_feat.insp_route_code IN ('NOTE', 'EWT2', 'EWT2', 'SOTE')
          THEN 1
        END = 1
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-10-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-03-14
          相关资源
          最近更新 更多