Обновление
Исходя из изменений вопроса, исходный ответ недействителен. Вместо этого решение является значительно более сложным, используя иерархический запрос для извлечения всех чисел из строки и затем LISTAGG
, чтобы собрать обратно список чисел, извлеченных из каждой строки. Чтобы извлечь все числа, мы используем этот запрос:
WITH cte AS (
SELECT DISTINCT data, level AS l, REGEXP_SUBSTR(data, '[NE]\d+', 1, level) AS num FROM test
CONNECT BY REGEXP_SUBSTR(data, '[NE]\d+', 1, level) IS NOT NULL
)
SELECT data, LISTAGG(SUBSTR(num, 2), ',') WITHIN GROUP (ORDER BY l) AS "All numbers"
FROM cte
GROUP BY data
Вывод (для новых образцов данных):
DATA All numbers
HEADER|E0|E1|E2|E3|E4|E5 0,1,2,3,4,5
HEADER|N0|N1|N2|N3|N4|N5 0,1,2,3,4,5
HEADER|N1000|E1001|N1002|E1003|N1004|N1005 1000,1001,1002,1003,1004,1005
HEADER|N125 125
HEADER|N156|E1|N7|E122|N4|E5 156,1,7,122,4,5
Чтобы выбрать только числа, начинающиеся с E
, мы модифицируем запросдля замены [EN]
в выражениях REGEXP_SUBSTR
просто E
, т. е.
SELECT DISTINCT data, level AS l, REGEXP_SUBSTR(data, 'E\d+', 1, level) AS num FROM test
CONNECT BY REGEXP_SUBSTR(data, 'E\d+', 1, level) IS NOT NULL
Вывод:
DATA E-numbers
HEADER|E0|E1|E2|E3|E4|E5 0,1,2,3,4,5
HEADER|N0|N1|N2|N3|N4|N5
HEADER|N1000|E1001|N1002|E1003|N1004|N1005 1001,1003
HEADER|N125
HEADER|N156|E1|N7|E122|N4|E5 1,122,5
Аналогичное изменение можно сделать, чтобы извлечь числа, начинающиеся с N
.
Демонстрация на dbfiddle
Оригинальный ответ
Одним из способов достижения желаемого результата является замена строкисимволов, ведущих к числу с этим номером и запятой, а затем заменить любые символы от последнего ,|
до конца строки из результата:
SELECT REGEXP_REPLACE(REGEXP_REPLACE('HEADER|N1000|E1001|N1002|E1003|N1004|N1005|', '.*?(\d+)', '\1,'), ',?\|.*$', '') FROM dual
Вывод:
1000,1001,1002,1003,1004,1005
Чтобы выводить только числа, начинающиеся с N
, мы добавляем это к строке префикса перед группой захвата:
SELECT REGEXP_REPLACE(REGEXP_REPLACE('HEADER|N1000|E1001|N1002|E1003|N1004|N1005|', '.*?N(\d+)', '\1,'), ',?\|.*$', '') FROM dual
Вывод:
1000,1002,1004,1005
Для вывода толькочисла, начинающиеся с E
, добавляем это к строке префикса перед группой захвата:
SELECT REGEXP_REPLACE(REGEXP_REPLACE('HEADER|N1000|E1001|N1002|E1003|N1004|N1005|', '.*?E(\d+)', '\1,'), ',?\|.*$', '') FROM dual
Выход:
1001,1003
Демонстрация на dbfiddle