我在解决子字符串之间的界限时遇到了问题。例如,对于字符串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而错误输出。
答案 0 :(得分:3)
您可以使用正则表达式,这将提取__
与以下_
或字符串结尾之间的所有内容:
REGEXP_SUBSTR(col, '(?<=__).+?(?=(_|$))')
'(?&lt; =)'是一个后视,即搜索以前的字符而不将其添加到结果中。在这里:搜索__
'。+'匹配任何字符,一次或多次。这将匹配,直到字符串结束(“贪婪”),'?'(“懒惰”)阻止。
'(?=)'是预测,即搜索以下字符而不将其添加到结果中。
(|)管道在多个备选项中拆分表达式。这里是下划线字符或字符串 $
的结尾