Сопоставление регулярных выражений подстроки SQL с шаблоном (TERADATA)

#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)