【问题标题】:Use REGEXP_SUBSTR to extract string of varied length使用 REGEXP_SUBSTR 提取不同长度的字符串
【发布时间】:2019-04-09 22:13:07
【问题描述】:

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

我尝试了各种形式的 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 返回。我做错了什么?

【问题讨论】:

  • 您已为多个数据库标记了您的问题。您实际使用的是哪一个,Teradata 还是 Oracle?
  • 我正在使用 Teradata

标签: sql teradata regexp-substr


【解决方案1】:

这似乎有效:

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

【讨论】:

    【解决方案2】:

    假设您使用 Teradata SQL 助手查询 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')
    

    【讨论】:

    • 谢谢,我已经删除了Oracle标签。这回答了我的问题。
    • 了解到 GPL 是 GNU 或开放软件组的一部分。看起来其他人编写了该功能并使其可供所有人使用。可能是为什么它没有记录在官方文档中。
    【解决方案3】:

    你可以试试下面的模式搜索!

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

    例如:在这个 'Num:12345T6' 将被过滤掉提供的字符串,还要注意 regexp_substr 中的最后一个参数是 'i',这确保了特定于大小写的搜索。

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

    【讨论】:

      猜你喜欢
      • 2012-06-26
      • 1970-01-01
      • 2016-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-09
      • 1970-01-01
      • 2019-10-26
      相关资源
      最近更新 更多