如何在 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
我是 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