我有
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%';
我有一个字段,其值如下模式所示。
名称1#值1 ~ 名称2#值2 ~ ......... ~ 名称X#值X ~ ........... ~ 名称N#值N
名称和值部分的数量没有限制。一个这样的名称将具有"ABCD"模式。我想提取包含"ABCD"模式的名称和值部分并将其放在单独的字段中。
我上面的代码抛出
"子字符串越界">
错误。
非常感谢帮助。谢谢。
由于您正在寻找一种模式和确切的名称,因此您不能使用NVP
,但不需要混合REGEXP_SUB
和SUBSTRING
。
这个正则表达式 (~|^(([^~]?ABCD。?#.*?)(~|$( 查找名称中包含ABCD
的第一个~name#value~
模式:
Trim(Both '~' FROM RegExp_Substr(col2, '(~|^)([^~]*?ABCD.*?)(~|$)',1,1,'i'))
'i'
表示不区分大小写的搜索。
如果您的版本支持(未记录的(RegExp_Substr_gpl
则无需修剪,因为它支持返回特定的捕获组:
RegExp_Substr_gpl( col2, '(~|^)([^~]*?ABCD.*?#.*?)(~|$)',1,1,'i',2)