#sql #regex #teradata
#sql #регулярное выражение #teradata
Вопрос:
У меня есть столбец LINES
с приведенными ниже строковыми шаблонами. Я хочу извлечь дату из строк. Например, для каждой строки мне понадобится дата, т.е. 20201123
или 20201124
в зависимости от обстоятельств. Поскольку даты находятся в разных позициях, я не могу их использовать substring
для этого. Как мне это сделать? Есть ли более простой метод регулярных substring
выражений, который я могу применить к этому.
Вот простой воспроизведенный код для тестирования.
create volatile table TEST
(LINES VARCHAR(1000) CHARACTER SET LATIN NOT CASESPECIFIC)
ON COMMIT PRESERVE ROWS;
insert into TEST values('path/to/file/OVERALL_GOTO_Datas.20201123.dat');
insert into TEST values('path/to/file/endartstmov20201124.20201124.dat');
insert into TEST values('path/to/file/TESTDEV20201123.20201123.5.0014.CHK.dat');
insert into TEST values('path/to/file/DEVTOTES20201124.20201124.5.0109.CHK.dat');
insert into TEST values('path/to/file/STORE_PARTNER.20201124.20201124.0.0501.CHK.dat');
SELECT * FROM TEST;
Ценю ваши ответы. Спасибо.
Ответ №1:
Использование teradata REGEXP_SUBSTR
Вы должны иметь возможность использовать это регулярное выражение :
SELECT REGEXP_SUBSTR(LINES, '(:?.([0-9]{8}).)')
см. : https://regex101.com/r/WRqEmY/2
Другой способ — с regexp_extract
помощью ( https://teradata.github.io/presto/docs/148t/functions/regexp.html )
SELECT regexp_extract(LINES, '(?:.([0-9]{8}).)', 1)
Комментарии:
1. Привет. Спасибо. Это работает довольно хорошо.
SELECT REGEXP_SUBSTR(LINES, '(:?.([0-9]{8}).)')
.2. @der_radler вы могли бы попробовать это:
SELECT regexp_extract('LINES, '(?:.([0-9]{8}).)', 1)
он должен дать вам только дату без двух.
.3. Использование Lookahead / Lookbehind для получения только даты:
'(?<=.)([0-9]{8})(?=.)
4. Спасибо. Можете ли вы указать на хорошее объяснение этой формулировки регулярных выражений. Было бы здорово изучить этот материал.
5. @Blag:
regexp_extract
в Teradata его нет (ссылка взята из Presto docu), ноtrim(both '.' from col)
его можно использовать. Или недокументированный вариант regexp_substring:RegExp_Substr_gpl(LINES, '.([0-9]{8}).', 1, 1, '', 1)