簡體   English   中英

WHERE 子句中的 CASE 語句使用 IN 查找多個值

[英]CASE statement in WHERE clause to look for multiple values using IN

我正在尋找編寫 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)

但是我知道編碼是錯誤的,但希望這能讓我了解我所追求的。

Boolean 邏輯比用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'))

只需使用 boolean 表達式:

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')
      )

WHERE子句中很少需要CASE表達式。 請注意,我還修復了第二個條件以使用'DY'而不是'D'

是的,boolean 表達式使它更容易,但如果你想在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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM