2017-05-25 129 views
1

希望有人可以帮助我编写SQL脚本或函数。基于2列填充列

我有一个数据源,我希望函数通过并根据2个指定的列填充相关列。

所以名称和值列。

E.g.

name= A+b+c+d 
Value= 2+1+3+5 

因此脚本/函数应该填充塔A,B,C,d的值与分别2,1,3,5的数据源中的每一行..

这可能吗?如果是这样,有人可以告诉我如何。

+0

这是一个更新或插入? – APC

+0

@apc它将是一个插入..因为数据目前在另一个表中,我想从该表中取出并插入到另一个 – tony123

+0

请提供一些示例数据和输出以澄清问题。 – miracle173

回答

0

甲骨文设置

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 

版本2:

甲骨文设置

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 
+0

首先非常感谢您的答案,这是非常有益的,我会看着这个并确保我理解每一行。我可以问一下,如果我将“值”从2 + 1 + 3 + 5更改为“x2 + x1 + x3 + x5”,我需要更改什么,以便输出显示A下的x2?如果我使用'x2 + x1 + x3 + x5'创建表格,值列仅显示“x2 + x1 + x”,它似乎会切断其余部分?我该如何纠正这一点? 感谢您的协助! – tony123

+0

@ tony123更新 – MT0

+0

版本1是我所追求的,只需要价值领域,以适应x1,x2等。是否有可能有,但仍然使用版本1? 感谢所有帮助到目前为止 – tony123