簡體   English   中英

Oracle SQL 中 CASE WHEN 后的 INSERT INTO 語句

[英]INSERT INTO statement after CASE WHEN in Oracle SQL

名為 ROUTINE r 的表確實具有以下屬性:ID (NUMBER), NAME (VARCHAR2(40)), MONDAY_YN (NUMBER(1,0)), TUESDAY_YN (NUMBER(1,0)),..., SUNDAY_YN ( NUMBER(1,0)),其中每個例程都有一個 ID、一個名稱以及工作日的表示(例如,MONDAY_YN=1)或不是(MONDAY_YN=0)。 此外,為了檢查例程是否在特定日期成功完成,還有另一個名為 ROUTINE_CHECKLIST rc 的表,其中包含例程 ID(與表 ROUTINE r 的外鍵連接)、日期和狀態(0 表示未完成,1 表示完畢)。

現在,我想使用以下 SQL 將數據插入到表 ROUTINE_CHECKLIST 中,這非常適合為指定的例程插入接下來的 3 個星期一。

insert into EBA_MTGMIN_ROUTINE_CHECKLIST (ROUTINE_ID, routine_date, done_yn)
select ID, next_day ( sysdate, 'monday' ) + ( ( level - 1 ) * 7 ), 0
from EBA_MTGMIN_ROUTINE r
where r.ID = 4711
connect by level <= 3;

根據表 ROUTINE 中的每個工作日屬性,應使用 case 語句,檢查是否 r.MONDAY_YN = 1 然后插入接下來的 3 個星期一,如果 r.TUESDAY_YN = 1 然后插入接下來的 3 個星期二,等等。為了滿足這些要求,我嘗試了在 SQL 語句中使用 SELECT CASE WHEN 子句,如下所示:

SELECT ro.MONDAY_YN,  
SELECT CASE WHEN ro.MONDAY_YN=1 THEN (insert into EBA_MTGMIN_ROUTINE_CHECKLIST (routine_date, done_yn, ROUTINE_ID)
select distinct next_day ( sysdate, 'monday' ) + ( ( level - 1 ) * 7 ), 0, r.ID
from EBA_MTGMIN_ROUTINE r
where r.ID = 4711
connect by level <= 3)
END
from EBA_MTGMIN_ROUTINE ro
where ro.ID = 4711;

該語句未按預期執行,但導致 ORA-00936:缺少表達式錯誤。 什么是擴展 Oracle SQL 或 PL/SQL 中的插入語句以填充表 ROUTINE_CHECKLIST 的優雅方法?

如果我對您的理解正確,也許您正在尋找這樣的東西。

insert into eba_mtgmin_routine_checklist
  (routine_date, done_yn, routine_id)
  (select *
   from (select distinct next_day(sysdate, 'monday') + (level - 1) * 7 routine_date,
                         0 done_yn, 
                         r.id routine_id
         from eba_mtgmin_routine r
         where r.id = 4711
         connect by level <= 3
        )
   where 1 = (select ro.monday_yn
              from eba_mtgmin_routine ro
              where ro.id = 4711
             )
  );

據我了解, routine表中的一條記錄可能有monday_yn = 1tuesday_yn = 1或者可能是全部,然后我們需要檢查每一天並將同一天的接下來 3 天插入到checklist表中。 我想出了利用insert all語句,我們可以使用一個源和條件觸發多個插入語句,

insert all
when monday_yn = 1 then
into eba_mtgmin_routine_checklist
 (routine_id, routine_date, done_yn)
values
 (routine_id,date_mon,0)
when tuesday_yn = 1 then
into eba_mtgmin_routine_checklist
 (routine_id, routine_date, done_yn)
values
 (routine_id,date_tue,0)
when sunday_yn = 1 then
into eba_mtgmin_routine_checklist
 (routine_id, routine_date, done_yn)
values
 (routine_id,date_sun,0)
 
select next_day(sysdate, 'monday')  + ((level - 1) * 7) date_mon
      ,next_day(sysdate, 'tuesday') + ((level - 1) * 7) date_tue
      ,next_day(sysdate, 'sunday')  + ((level - 1) * 7) date_sun
      , 0 done_yn
      , r.id routine_id
      , monday_yn
      , tuesday_yn
      , sunday_yn
  from eba_mtgmin_routine r
 where r.id = 4711
connect by level <= 3;

演示可以在這里找到

編輯:OP 要求的更新答案

insert all
when monday_yn = 1 then
into eba_mtgmin_routine_checklist
 (routine_id, routine_date, done_yn)
values
 (routine_id,date_mon,0)
when tuesday_yn = 1 then
into eba_mtgmin_routine_checklist
 (routine_id, routine_date, done_yn)
values
 (routine_id,date_tue,0)
when sunday_yn = 1 then
into eba_mtgmin_routine_checklist
 (routine_id, routine_date, done_yn)
values
 (routine_id,date_sun,0)
select next_day(sysdate, 'monday') + 
      ((lvl - 1) * 7) date_mon
      ,next_day(sysdate, 'tuesday') + 
      ((lvl - 1) * 7) date_tue
      ,next_day(sysdate, 'sunday') + 
      ((lvl - 1) * 7) date_sun
      , 0 done_yn
      , a.id routine_id
      , a.monday_yn
      , a.tuesday_yn
      , a.sunday_yn
  from
     ( select id, monday_yn, tuesday_yn, sunday_yn 
         from eba_mtgmin_routine r) a,
     (select level lvl
        from dual
      connect by level <= 3) b

您可以在小提琴中驗證

暫無
暫無

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

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