Как разделить строковое поле на несколько строк в Oracle Data Integrator 12c

#sql #oracle #oracle-data-integrator

#sql #Oracle #oracle-data-integrator

Вопрос:

Я новичок в ODI 12c. Я недавно установил его и провел несколько тестов. Моя проблема в том, что у меня есть такая таблица:

введите описание изображения здесь

Я хочу разделить столбец ПРАВИЛ в разных строках, как это в ODI 12c:

введите описание изображения здесь

Не могли бы вы подсказать мне, как я могу это сделать в ODI 12c?

Любая помощь действительно ценится.

Комментарии:

1. Я никогда не работал с ODI 12c , но вы ищете запрос?

2. Да, я не уверен, но, возможно, я смогу использовать запрос в ODI

Ответ №1:

REGEXP_SUBSTR() не может использоваться непосредственно в ODI (за исключением может использоваться в представлении БД), хотя REGEXP_REPLACE() может быть для версии 12. Но было бы проще использовать REGEXP_SUBSTR() функцию для разделения, если бы ее можно было использовать. Но другую функцию сложнее использовать для таких целей разделения.

Кроме того, вы можете использовать стандартные функции former, такие как 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

Комментарии:

1. Уважаемый @Barbaros, спасибо за ваш отзыв. Я использовал запрос в toad, но он был таким медленным. Я проверю это и запишу результат здесь.

2. добро пожаловать @M_Gh . Кстати, я предположил, что строки правил не содержат никаких пробелов, даже не заполненных в конце или в начале, не так ли? Для тех, у кого есть заполненные пробелы в конце или начале, функция TRIM() также может быть добавлена для столбца правил.

3. Я не знаю, почему я использую этот запрос при создании новой таблицы, для его завершения требуется много времени.

Ответ №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;