使用REGEXP_SUBSTR提取不同长度的字符串

时间:2019-04-08 23:03:02

标签: sql teradata regexp-substr

我想从第二次出现特定字符之间的字符串中提取长度可变的字母数字文本。

我尝试了各种形式的substr和regexp_substr,但似乎语法不正确。这是在Teradata SQL助手中使用的。在过去,我必须先创建一个临时表并使用两次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 个答案:

答案 0 :(得分:2)

这似乎可行:

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

答案 1 :(得分:0)

您可以尝试以下模式搜索!

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:'的字母数字字符,有助于找出零个或多个出现指定的模式。

对于例如:,在此'Num:12345T6'中,将从提供的字符串中过滤掉,还请注意regexp_substr中的最后一个参数为'i',以确保区分大小写。

最后,Regexp_replace将用空字符串替换regexp_substr输出中的模式“ Num:”,最终字符串为“ 12345T6”。

答案 2 :(得分:0)

假设您使用Teradata SQL Assistant查询Teradata系统(但为什么要标记Oracle),则RegEx语法略有不同(都使用不同的RegEx方言):

Teradata的RegExp_Substr不支持 subexpression 参数,您可以切换到(我真的不知道为什么)未记录的RegExp_Substr_gpl

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

或使用\K告诉RegEx忘记先前的匹配项:

RegExp_Substr(x, 'Num:\K[^,]*', 1,1, 'i')