Как разделить строки с помощью двух разделителей в функциях Oracle 11g regexp_substr
У меня есть сомнения, чтобы разделить строку с помощью разделителя.
Первое разделение на основе разделителя выберите те разделенные строки должны быть разделены на основе - разделитель
Моя оригинальная строка: UMC12I-1234,CSM3-123,VQ,
Ожидаемый результат:
UMC12I
CSM3
VQ
Каждое значение приходит как значение строки
Я попробовал вариант
WITH fab_sites AS (
SELECT trim(regexp_substr('UMC12I-1234,CSM3-123,VQ,', '[^,]+', 1, LEVEL)) fab_site
FROM dual
CONNECT BY LEVEL <= regexp_count('UMC12I-1234,CSM3-123,VQ,', '[^,]+')+1
)
SELECT fab_site FROM fab_sites WHERE fab_site IS NOT NULL
- разделены на основе разделителя
Выход:
UMC12I-1234
CSM3-123
VQ
Как я могу получить ожидаемый результат? (нужно снова разделить - разделитель)
2 ответа
Вы можете попробовать этот запрос:
WITH fab_sites AS (
SELECT TRIM(',' FROM REGEXP_SUBSTR('UMC12I-1234,CSM3-123,VQ,', '(^|,)[^,-]+', 1, LEVEL)) fab_site
FROM dual
CONNECT BY LEVEL <= REGEXP_COUNT('UMC12I-1234,CSM3-123,VQ,', '(^|,)[^,-]+')
)
SELECT fab_site
FROM fab_sites;
Мы начинаем с сопоставления любой подстроки, которая начинается либо с начала всей строки ^
или с запятой ,
, разделитель. Затем мы получаем все символы, которые не соответствуют ни запятой, ни тире -
, Как только у нас есть эта подстрока, мы удаляем из нее все оставшиеся запятые.
PS Я думаю, что +1
в CONNECT BY
пункт посторонний, как и WHERE NOT NULL
во "внешнем" запросе.
Вы можете извлечь "слова" до -
с regexp_substr
с помощью
([^,-]+)(-[^,-]+)?
Шаблон будет соответствовать и захватить в группу 1 один или несколько символов, кроме ,
а также -
, тогда будет соответствовать необязательной последовательности -
и 1+ символов кроме ,
а также -
,
Смотрите демо-версию регулярного выражения.
Использовать этот regex_substr
строка вместо вашей с приведенным выше регулярным выражением:
SELECT trim(regexp_substr('UMC12I-1234,CSM3-123,VQ,', '([^,-]+)(-[^,-]+)?', 1, LEVEL, NULL, 1)) fab_site
Посмотреть онлайн демо