我有一個表格,其中的狀態應該根據創建日期進行更改。我嘗試使用 DML 請求來實作這一點,但是通過這樣的更新,所有行都會發生更改。如何使我的代碼更有效地只更改我在 CASE 中指出的那些行?
UPDATE your_day_test t
SET t.status = CASE
WHEN t.create_date < trunc(SYSDATE - 28)
AND t.status = 1 THEN
-2
WHEN t.create_date < trunc(SYSDATE - 7)
AND t.status IN (0, 3) THEN
-1
WHEN t.create_date < trunc(SYSDATE - 42)
AND t.status = -2 THEN
-3
else
t.status
END
WHERE trunc(t.create_date) > trunc(SYSDATE - 42)
AND t.status IN (0, 1, 3, -2);
COMMIT;
uj5u.com熱心網友回復:
在 Oracle 中,您可以更新 select stament 的結果,因此如果您可以撰寫一個僅選擇要更新的行的選擇,您可以執行以下操作:
update (
select status,
CASE
WHEN t.create_date < trunc(SYSDATE - 28)
AND t.status = 1 THEN -2
WHEN t.create_date < trunc(SYSDATE - 7)
AND t.status IN (0, 3) THEN -1
WHEN t.create_date < trunc(SYSDATE - 42)
AND t.status = -2 THEN -3
END new_status,
create_date
from your_day_test t
WHERE trunc(t.create_date) > trunc(SYSDATE - 42)
AND t.status IN (0, 1, 3, -2)
) set status = new_status
where status <> new_status; -- assuming status is never null
uj5u.com熱心網友回復:
您正在使用日歷日期檢查 42 天范圍內的 create_date,但在今天的日期之后過濾 where 子句中的 create_date。所以你只需要更新你的 where 條件,如下所示 -
UPDATE your_day_test t
SET t.status = CASE WHEN t.create_date < trunc(SYSDATE - 7) AND t.status IN (0, 3)
THEN -1
WHEN t.create_date < trunc(SYSDATE - 28) AND t.status = 1
THEN -2
WHEN t.create_date < trunc(SYSDATE - 42) AND t.status = -2
THEN -3
ELSE t.status
END
WHERE t.create_date < trunc(SYSDATE - 42)
AND t.status IN (0, 1, 3, -2);
uj5u.com熱心網友回復:
您也可以在 where 子句中使用 case 陳述句。在這種情況下,您不需要該ELSE條款:
UPDATE your_day_test t
SET t.status = CASE
WHEN t.create_date < trunc(SYSDATE - 28)
AND t.status = 1 THEN
-2
WHEN t.create_date < trunc(SYSDATE - 7)
AND t.status IN (0, 3) THEN
-1
WHEN t.create_date < trunc(SYSDATE - 42)
AND t.status = -2 THEN
-3
END
WHERE CASE
WHEN t.create_date < trunc(SYSDATE - 28)
AND t.status = 1 THEN
-2
WHEN t.create_date < trunc(SYSDATE - 7)
AND t.status IN (0, 3) THEN
-1
WHEN t.create_date < trunc(SYSDATE - 42)
AND t.status = -2 THEN
-3
END IN (-1,-2,-3);
uj5u.com熱心網友回復:
將where其他謂詞添加到您的條件中,過濾更新無效的行
WHERE trunc(t.create_date) > trunc(SYSDATE - 42)
AND t.status IN (0, 1, 3, -2)
/* filter for real updates */
AND t.status != CASE
WHEN t.create_date < trunc(SYSDATE - 28)
AND t.status = 1 THEN
-2
WHEN t.create_date < trunc(SYSDATE - 7)
AND t.status IN (0, 3) THEN
-1
WHEN t.create_date < trunc(SYSDATE - 42)
AND t.status = -2 THEN
-3
else
t.status
END
此外,如果您厭倦了每天更新表(并且您不需要對更改的status列進行索引訪問) - 您可以僅在視圖中生成新狀態。
例子
create or replace view my_status as
select
STATUS as STATUS_ORIG,
CREATE_DATE,
CASE
WHEN create_date < trunc(SYSDATE - 28)
AND status = 1 THEN
-2
WHEN create_date < trunc(SYSDATE - 7)
AND status IN (0, 3) THEN
-1
WHEN create_date < trunc(SYSDATE - 42)
AND status = -2 THEN
-3
else
status
END as STATUS
from tab a;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/339042.html
上一篇:根據其他表中的值更新表列
下一篇:SQL替換型別化XML資料
