【问题标题】:How to split a string field in several rows in Oracle Data Integrator 12c如何在 Oracle Data Integrator 12c 中将字符串字段拆分为多行
【发布时间】:2020-09-24 17:37:49
【问题描述】:

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

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

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

非常感谢任何帮助。

【问题讨论】:

  • 我从未与ODI 12c 合作过,但您在寻找查询吗?
  • 是的,我不确定,但也许我可以在 ODI 中使用查询

标签: sql oracle oracle-data-integrator


【解决方案1】:

REGEXP_SUBSTR() 不能直接在 ODI 中使用(除了可以在 DB 视图中使用),而 REGEXP_REPLACE() 可以用于版本 12。但是通过使用 @ 会更容易操作987654324@函数,以便在可以使用时进行拆分。但是另一个函数更难用于这种拆分目的。

或者,您可以使用标准的前函数(例如 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

【讨论】:

  • 亲爱的@Barbaros,感谢您的反馈。我在蟾蜍中使用了一个查询,但它太慢了。我会检查这个并将结果写在这里。
  • 不客气@M_Gh。顺便说一句,我假设规则字符串不包含任何空格,甚至没有在尾随或开头填充,不是吗?对于那些在结尾或开头有填充的白斑的人,还可以为规则列添加 TRIM() 函数。
  • 不知道为什么我在创建新表中使用这个查询,需要很长时间才能完成。
【解决方案2】:

我对 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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-17
    • 2018-12-06
    相关资源
    最近更新 更多