【问题标题】:Teradata substring out of boundsTeradata 子字符串越界
【发布时间】:2023-03-14 05:03:01
【问题描述】:

我在确定子字符串之间的界限时遇到了问题。例如对于字符串063016_shape_tea_cleanse__emshptea1_,我想将emshptea1作为子字符串,但它也必须适用于字符串063016_shape_tea_cleanse__emshptea1_TESTDATA_HERE

目前我有:

sel SUBSTR('063016_shape_tea_cleanse__emshptea1_',POSITION('__' IN '063016_shape_tea_cleanse__emshptea1_')+2,
    POSITION('_' IN  SUBSTR('063016_shape_tea_cleanse__emshptea1_',POSITION('__' IN '063016_shape_tea_cleanse__emshptea1_') + 2,CHARACTER_LENGTH('063016_shape_tea_cleanse__emshptea1_') - (POSITION('__' IN '063016_shape_tea_cleanse__emshptea1_') + 2)))-1)

但由于它试图将 27 子串化为 -1 而导致出错。

【问题讨论】:

  • 那么,你想要cleanse__ 之后直到下一个_ 之后的所有内容吗?

标签: sql substring teradata


【解决方案1】:

您可以使用正则表达式,这将提取__ 和以下_ 或字符串结尾之间的所有内容:

REGEXP_SUBSTR(col, '(?<=__).+?(?=(_|$))')

'(? 是一种后视,即搜索以前的字符而不将其添加到结果中。在这里:搜索__

'.+' 匹配任何字符一次或多次。这将匹配到字符串的末尾(“greedy”),'?'(“lazy”)阻止了这种情况。

'(?= )' 是前瞻,即搜索后面的字符而不将其添加到结果中。

( | ) 管道将表达式拆分为多个备选方案。这里可以是下划线字符,也可以是字符串 $

的结尾

【讨论】:

  • 谢谢,成功了。你能向我解释一下正则表达式中的所有符号代表什么吗?
  • @BobDunakey:添加了一些解释。正则表达式很强大,我只知道基础:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-15
  • 2014-07-31
  • 2016-03-01
  • 2012-12-01
  • 2014-11-18
  • 1970-01-01
相关资源
最近更新 更多