[英]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 = 1
和tuesday_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.