希望有人可以幫助我編寫SQL腳本或函數。基於2列填充列
我有一個數據源,我希望函數通過並根據2個指定的列填充相關列。
所以名稱和值列。
E.g.
name= A+b+c+d
Value= 2+1+3+5
因此腳本/函數應該填充塔A,B,C,d的值與分別2,1,3,5的數據源中的每一行..
這可能嗎?如果是這樣,有人可以告訴我如何。
希望有人可以幫助我編寫SQL腳本或函數。基於2列填充列
我有一個數據源,我希望函數通過並根據2個指定的列填充相關列。
所以名稱和值列。
E.g.
name= A+b+c+d
Value= 2+1+3+5
因此腳本/函數應該填充塔A,B,C,d的值與分別2,1,3,5的數據源中的每一行..
這可能嗎?如果是這樣,有人可以告訴我如何。
甲骨文設置:
CREATE TABLE your_table (
name VARCHAR2(7)
CHECK (name IS NULL OR REGEXP_LIKE(name, '^[A-D](\+[A-D]){0,3}$', 'i'),
value VARCHAR2(200),
A VARCHAR2(50),
B VARCHAR2(50),
C VARCHAR2(50),
D VARCHAR2(50)
);
INSERT INTO your_table (name, value, a, b, c, d)
SELECT 'a+b+c+d', 'x2+x1+x3+x5', NULL, NULL, NULL, NULL FROM DUAL UNION ALL
SELECT 'a+d+c', 'y7+y3+y4', NULL, NULL, NULL, NULL FROM DUAL;
更新語句:
MERGE INTO your_table dst
USING (
WITH splitstrings (rid, name, value, col, val, lvl) AS (
SELECT ROWID,
UPPER(name),
value,
REGEXP_SUBSTR(UPPER(name), '[^+]+', 1, 1),
REGEXP_SUBSTR(value, '[^+]+', 1, 1),
1
FROM your_table
WHERE name IS NOT NULL
AND value IS NOT NULL
UNION ALL
SELECT rid,
name,
value,
REGEXP_SUBSTR(name, '[^+]+', 1, lvl + 1),
REGEXP_SUBSTR(value, '[^+]+', 1, lvl + 1),
lvl + 1
FROM splitstrings
WHERE lvl < LEAST(
REGEXP_COUNT(name, '[^+]+'),
REGEXP_COUNT(value, '[^+]+')
)
)
SELECT *
FROM (SELECT rid, col, val FROM splitstrings)
PIVOT (MAX(val) FOR col IN ('A' AS a, 'B' AS b, 'C' AS c, 'D' AS d))
) src
ON (src.rid = dst.ROWID)
WHEN MATCHED THEN
UPDATE
SET A = COALESCE(src.A, dst.A),
B = COALESCE(src.B, dst.B),
C = COALESCE(src.C, dst.C),
D = COALESCE(src.D, dst.D);
輸出:
SELECT * FROM your_table;
NAME VALUE A B C D
------- ----------- -- -- -- --
a+b+c+d x2+x1+x3+x5 x2 x1 x3 x5
a+d+c y7+y3+y4 y7 y4 y3
甲骨文設置:
CREATE TABLE your_source (
name VARCHAR2(50),
value VARCHAR2(50)
);
INSERT INTO your_source
SELECT 'a+b+c+d', 'x2+x1+x3+x5' FROM DUAL UNION ALL
SELECT 'a+d+c', 'y7+y3+y4' FROM DUAL;
CREATE TABLE your_destination (
-- name VARCHAR2(50),
-- value VARCHAR2(50),
A VARCHAR2(20),
B VARCHAR2(20),
C VARCHAR2(20),
D VARCHAR2(20)
);
插入語句:
INSERT INTO your_destination (/* name, value, */ A, B, C, D)
WITH splitstrings (rid, name, value, col, val, lvl) AS (
SELECT ROWID,
UPPER(name),
value,
REGEXP_SUBSTR(UPPER(name), '[^+]+', 1, 1),
REGEXP_SUBSTR(value, '[^+]+', 1, 1),
1
FROM your_source
WHERE name IS NOT NULL
AND value IS NOT NULL
UNION ALL
SELECT rid,
name,
value,
REGEXP_SUBSTR(name, '[^+]+', 1, lvl + 1),
REGEXP_SUBSTR(value, '[^+]+', 1, lvl + 1),
lvl + 1
FROM splitstrings
WHERE lvl < LEAST(
REGEXP_COUNT(name, '[^+]+'),
REGEXP_COUNT(value, '[^+]+')
)
)
SELECT /* name, value, */ A,B,C,D
FROM (SELECT rid, /* name, value, */ col, val FROM splitstrings)
PIVOT (MAX(val) FOR col IN ('A' AS a, 'B' AS b, 'C' AS c, 'D' AS d));
輸出:
SELECT * FROM your_destination
A B C D
-- -- -- --
x2 x1 x3 x5
y7 y4 y3
這是一個更新或插入? – APC
@apc它將是一個插入..因爲數據目前在另一個表中,我想從該表中取出並插入到另一個 – tony123
請提供一些示例數據和輸出以澄清問題。 – miracle173