【问题标题】:SQL Substring REGEX pattern matching (TERADATA)SQL 子字符串 REGEX 模式匹配 (TERADATA)
【发布时间】:2021-03-07 08:50:02
【问题描述】:

我有一列说LINES,下面的字符串模式。我想从字符串中提取日期。例如,对于每一行,我都需要日期,即2020112320201124,无论哪种情况。 由于日期位于不同的位置,因此我不能真正使用substring。我该怎么做? substring 中是否有更简单的 REGEX 方法可以应用于此。

这是一个简单的复制代码用于测试。

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;

感谢您的回复。谢谢。

【问题讨论】:

    标签: sql regex teradata


    【解决方案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)
    

    【讨论】:

    • 嗨。谢谢你。这工作得很好。 SELECT REGEXP_SUBSTR(LINES, '(:?\.([0-9]{8})\.)').
    • @der_radler 你可以试试这个:SELECT regexp_extract('LINES, '(?:\.([0-9]{8})\.)', 1) 它应该只给你没有两个. 的日期。
    • 使用 Lookahead/Lookbehind 仅获取日期:'(?<=\.)([0-9]{8})(?=\.)
    • 谢谢。你能指出这个正则表达式的一个很好的解释吗?学习这些东西会很棒。
    • @Blag:Teradata 中没有 regexp_extract(链接来自 Presto docu),但可以使用 trim(both '.' from col)。或 regexp_substring 的未记录变体:RegExp_Substr_gpl(LINES, '\.([0-9]{8}).', 1, 1, '', 1)
    猜你喜欢
    • 2022-06-10
    • 1970-01-01
    • 1970-01-01
    • 2018-05-29
    • 1970-01-01
    • 1970-01-01
    • 2019-04-22
    • 2011-09-16
    • 2013-02-12
    相关资源
    最近更新 更多