使用 REGEXP_SUBSTR 提取不同长度的字符串
Use REGEXP_SUBSTR to extract string of varied length
我想从第二次出现的特定字符之间的字符串中提取不同长度的字母数字文本。
我尝试了各种形式的 substr 和 regexp_substr 但似乎无法获得正确的语法。这是用于 Teradata SQL 助手。在过去,我必须创建一个 temp table 并使用 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
我想要的结果是 return 仅 "Num:" 和下一个“,”之间的内容,在本例中为“12345T6”。订单号的长度可能会有所不同,因此它不是固定长度。当我 运行 我的代码实际输出是一个 '?' return由 Teradata 编辑。我做错了什么?
这似乎有效:
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:
,然后捕获尽可能多的单词字符(,
不是单词字符)。最后一个参数 - subexpr
- 指定你想要的子表达式(又名捕获组),没有它整个事情将被匹配(Num:12345T6
)。
您可以试试下面的模式搜索!
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 pattern search ['Num:[A-Za-z0-9]*'],会先过滤掉跟在pattern 'Num:'后面的字母数字字符,astriek,有助于找出零次或多次出现的指定模式。
例如:在这个'Num:12345T6'中会过滤掉提供的字符串,还要注意regexp_substr中的最后一个参数是'i',这确保了大小写搜索。
最后,Regexp_replace 会将 regexp_substr 输出中的模式 'Num:' 替换为空字符串,导致最终字符串为“12345T6”。
假设您使用 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')
我想从第二次出现的特定字符之间的字符串中提取不同长度的字母数字文本。
我尝试了各种形式的 substr 和 regexp_substr 但似乎无法获得正确的语法。这是用于 Teradata SQL 助手。在过去,我必须创建一个 temp table 并使用 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
我想要的结果是 return 仅 "Num:" 和下一个“,”之间的内容,在本例中为“12345T6”。订单号的长度可能会有所不同,因此它不是固定长度。当我 运行 我的代码实际输出是一个 '?' return由 Teradata 编辑。我做错了什么?
这似乎有效:
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:
,然后捕获尽可能多的单词字符(,
不是单词字符)。最后一个参数 - subexpr
- 指定你想要的子表达式(又名捕获组),没有它整个事情将被匹配(Num:12345T6
)。
您可以试试下面的模式搜索!
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 pattern search ['Num:[A-Za-z0-9]*'],会先过滤掉跟在pattern 'Num:'后面的字母数字字符,astriek,有助于找出零次或多次出现的指定模式。
例如:在这个'Num:12345T6'中会过滤掉提供的字符串,还要注意regexp_substr中的最后一个参数是'i',这确保了大小写搜索。
最后,Regexp_replace 会将 regexp_substr 输出中的模式 'Num:' 替换为空字符串,导致最终字符串为“12345T6”。
假设您使用 Teradata SQL Assistant 查询 Teradata 系统(但为什么要标记 Oracle)RegEx 语法略有不同(两者都使用不同的 RegEx 方言):
Teradata 的 RegExp_Substr 不支持 subexpression 参数,您可以切换到(我真的不知道为什么)未记录的 RegExp_Substr_gpl
RegExp_Substr_gpl(x, 'Num:([^,]*)', 1, 1, 'i', 1)
或使用 \K
:
RegExp_Substr(x, 'Num:\K[^,]*', 1,1, 'i')