2

我有

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#ValueN

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

我上面的代码抛出

“子字符串越界”

错误。

非常感谢您的帮助。谢谢你。

4

1 回答 1

1

当您正在寻找无法使用的模式和确切名称时NVP,无需混合REGEXP_SUBSUBSTRING

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

Trim(Both '~' FROM RegExp_Substr(col2, '(~|^)([^~]*?ABCD.*?)(~|$)',1,1,'i'))

'i'表示不区分大小写的搜索。

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

RegExp_Substr_gpl( col2, '(~|^)([^~]*?ABCD.*?#.*?)(~|$)',1,1,'i',2)
于 2017-07-25T19:38:07.227 回答