我需要洗掉重復的腳本代碼。正如我們在提到的代碼塊中看到的,我需要以相同的方式在同一張表上運行多個陣列的更新命令。只是 where 子句中傳遞的資料不同。目前,由于我撰寫了多個回圈,因此代碼是重復的。有人可以通過提供不同的方法(例如我們如何使用該函式或其他方法)來幫助我減少代碼行嗎?
DO
$do$
DECLARE
m text[];
acc text[] := '{{acc_PROF,1},{acc_PER,2},{cad_PROF,3}}';
lev text[] := '{{lev_ADMIN,1},{lev_PROF,2}}';
att text[] := '{{att_ADMIN,1},{att_PROF,2}}';
BEGIN
--For acc profile template
FOREACH m SLICE 1 IN ARRAY acc
LOOP
update profile set order_num =CAST (m[2] as bigint) where persistent_id =m[1];
END LOOP;
--For lev profile template
FOREACH m SLICE 1 IN ARRAY lev
LOOP
update profile set order_num =CAST (m[2] as bigint) where persistent_id =m[1];
END LOOP;
--For att profile template
FOREACH m SLICE 1 IN ARRAY att
LOOP
update profile set order_num =CAST (m[2] as bigint) where persistent_id =m[1];
END LOOP;
END
$do$
LANGUAGE plpgsql
;
uj5u.com熱心網友回復:
您可以使用簡單的 sql 命令。
CREATE temp TABLE profile (
order_num bigint,
persistent_id text
);
INSERT INTO profile (persistent_id)
VALUES ('acc_PROF'),
('acc_PER'),
('cad_PROF'),
('lev_ADMIN'),
('lev_PROF'),
('att_ADMIN'),
('att_PROF');
然后
WITH cte (
persistent_id,
order_sum
) AS (
VALUES ('acc_PROF', 1),
('acc_PER', 2),
('cad_PROF', 3),
('lev_ADMIN', 1),
('lev_PROF', 2),
('att_ADMIN', 1),
('att_PROF', 2))
UPDATE
profile
SET
order_num = cte.order_sum
FROM
cte
WHERE
cte.persistent_id = profile.persistent_id
RETURNING
*;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/504841.html
