REGEXP_SUBSTR - “substring out of bounds”错误

时间:2017-07-25 17:25:28

标签: pattern-matching teradata regexp-substr

我有

select col1,
( REGEXP_SUBSTR ( col2, ' ( ?<=~ ) .*? ( ?=ABCD ) ' ) 
    || SUBSTRING ( col2 FROM POSITION ( 'ABCD' IN col2 ) 
    FOR POSITION ( '~' IN SUBSTRING ( col2 FROM POSITION ( 'ABCD' IN col2 ) ) ) -1 ) as xyz) 
from db.table 
where col2 like '%ABCD%';

我有一个字段,其值如下图所示。

  

Name1#Value1~Name2#Value2~ .........~ NameX#ValueX~ ...........〜   NameN#值N

名称和价值部分的数量没有限制。一个这样的名称将具有'ABCD'模式。我想提取包含'ABCD'模式的名称和值的部分,并将其放在一个单独的字段中。

我上面的代码抛出

  

“substring out of bounds”

错误。

非常感谢帮助。谢谢。

1 个答案:

答案 0 :(得分:1)

当您正在寻找模式和确切名称时,您无法使用NVP,但无需混合REGEXP_SUB和{{1} }。

此正则表达式(~|^)([^~]?ABCD.?#.*?)(~|$)找到第一个SUBSTRING模式,其中包含~name#value~名称:

ABCD

Trim(Both '~' FROM RegExp_Substr(col2, '(~|^)([^~]*?ABCD.*?)(~|$)',1,1,'i')) 表示不区分大小写搜索。

如果您的版本支持(未记录的)'i',则无需修剪,因为它支持返回特定的捕获组:

RegExp_Substr_gpl