Teradata 子字符串越界

Teradata substring out of bounds

我在确定子字符串之间的界限时遇到问题。例如对于字符串 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,所以出错了。

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

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

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

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

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

( | ) 管道将一个表达式拆分为多个选项。这里要么是下划线字符,要么是字符串的结尾 $