如何在 Oracle Data Integrator 12c 中将字符串字段拆分为多行

How to split a string field in several rows in Oracle Data Integrator 12c

我是 ODI 12c 的新手。我最近安装了它并对其进行了几次测试。我的问题是我有这样的 table:

我想在 ODI 12c 中将 RULES 列拆分为不同的行:

能否请您指导我如何在 ODI 12c 中做到这一点?

非常感谢任何帮助。

我对 ODI 的经验不多,但是像下面这样的查询应该拆分您的规则,以便每条规则都有自己的行。

WITH
    some_data (timestamp, rules)
    AS
        (SELECT SYSDATE, '2,4,5' FROM DUAL
         UNION ALL
         SELECT SYSDATE - 1, '3,6' FROM DUAL)
  SELECT sd.timestamp,
         REGEXP_SUBSTR (sd.rules,
                        '[^,]+',
                        1,
                        lines.COLUMN_VALUE)    AS rule_number
    FROM some_data sd,
         TABLE (CAST (MULTISET (    SELECT LEVEL     AS level_num
                                      FROM DUAL
                                CONNECT BY INSTR (sd.rules,
                                                  ',',
                                                  1,
                                                  LEVEL - 1) > 0) AS SYS.odciNumberList)) lines
ORDER BY timestamp, rule_number;

REGEXP_SUBSTR() 不能在 ODI 中直接使用(除了可以在数据库视图中使用 )而 REGEXP_REPLACE() 可以用于版本 12。但是它如果可以使用的话,通过使用REGEXP_SUBSTR()函数来拆分会更容易操作。但是另一个函数更难用于这种拆分目的。

或者,您可以使用标准的前函数,例如 SUBSTR()INSTR()LENGTH() 以及分层查询,以便根据拆分生成行,例如:

 SELECT timestamp,
        CASE WHEN level = 1 
             THEN SUBSTR( rules, 1, INSTR(rules,',') - 1 )
             WHEN level = LENGTH(rules) - LENGTH(REPLACE(rules,',')) + 1
             THEN SUBSTR( rules, INSTR(rules,',',1,level-1)+1,
                                 LENGTH(rules)-INSTR(rules,',',1,level-1)+1)
             ELSE SUBSTR( rules, INSTR(rules,',',1,level-1)+1,  
                                 INSTR(rules,',',1,level)-INSTR(rules,',',1,level-1)-1)
              END AS rules
   FROM t
CONNECT BY level <= LENGTH(rules) - LENGTH(REPLACE(rules,',')) + 1
    AND PRIOR SYS_GUID() IS NOT NULL
    AND PRIOR timestamp = timestamp 

Demo