#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
Комментарии:
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;