Используйте REGEXP_SUBSTR для извлечения строки различной длины - PullRequest
0 голосов
/ 09 апреля 2019

Я хочу извлечь буквенно-цифровой текст различной длины из строки между вторыми вхождениями определенных символов.

Я пробовал различные формы substr и regexp_substr, но, похоже, не могу понять синтаксис правильно. Это для использования в Teradata SQL assistant. Раньше мне приходилось создавать временную таблицу и дважды использовать substr, прежде чем обрезать строку до того, что мне нужно. Я хочу сделать все это за один раз.

SELECT regexp_substr('Channel:DF GB, Order Num:12345T6, Order Date:01/01/2019, Charge Codes:TAXES,,GBRAX', 'Num\\:+(\\:+)',1,2, ':') as RESULTING_STRING

Мой желаемый результат - возвращать ТОЛЬКО то, что находится между "Num:" и следующим "," в данном случае "12345T6". Длина номера заказа может варьироваться, поэтому она не является фиксированной длиной. Когда я запускаю свой код, фактический вывод - «?» вернулся Teradata. Что я делаю не так?

Ответы [ 3 ]

2 голосов
/ 09 апреля 2019

Это похоже на работу:

SELECT regexp_substr('Channel:DF GB, Order Num:12345T6, Order Date:01/01/2019, Charge Codes:TAXES,,GBRAX', 'Num:(\w*)', 1, 1, NULL, 1) as RESULTING_STRING from dual

Находит Num: и затем захватывает столько символов слова (, - это не слово char), сколько доступно. Последний параметр - subexpr - указывает, какое подвыражение (или группу захвата) вы хотите, без него все будет сопоставлено (Num:12345T6).

0 голосов
/ 09 апреля 2019

Предполагается, что вы используете Teradata SQL Assistant для запроса системы Teradata (но почему вы тогда помечаете Oracle), синтаксис RegEx немного отличается (оба используют разные диалекты RegEx):

RegExp_Substr Teradata не поддерживаетпараметр подвыражение , вы можете либо переключиться на (не знаю почему) недокументированное RegExp_Substr_gpl

RegExp_Substr_gpl(x, 'Num:([^,]*)', 1, 1, 'i', 1)

или сказать RegEx, чтобы он забыл предыдущее совпадение, используя \K:

RegExp_Substr(x, 'Num:\K[^,]*', 1,1, 'i')
0 голосов
/ 09 апреля 2019

Вы можете попробовать поиск по шаблону ниже!

SELECT REGEXP_REPLACE ((REGEXP_SUBSTR('Channel:DF GB, Order Num:12345T6, Order Date:01/01/2019, Charge Codes:TAXES,,GBRAX', 'Num:[A-Za-z0-9]*',1,1, 'i')),'Num:','',1,1,'i')  AS RESULTING_STRING

Поиск по шаблону Regexp_substr ['Num: [A-Za-z0-9] *'], сначала отфильтрует буквенно-цифровые символы, следующие за шаблоном 'Num:', astriek, помогает найти ноль или более вхождений указанный образец.

Например, например: в этом 'Num: 12345T6' будет отфильтровано из предоставленной строки, также обратите внимание, что последним параметром в regexp_substr является 'i', который обеспечивает поиск по конкретному регистру.

Наконец, Regexp_replace заменит шаблон 'Num:' из вывода regexp_substr пустой строкой, в результате чего конечная строка будет иметь вид «12345T6».

...