【问题标题】:REGEXP_SUBSTR - "substring out of bounds" errorREGEXP_SUBSTR - “子字符串越界”错误
【发布时间】:2017-07-26 03:38:07
【问题描述】:

我有

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 ~ ......... ~ 名称N#值N

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

我上面的代码抛出

“子串越界”

错误。

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

【问题讨论】:

  • 你能显示一些实际数据吗,看起来像名称-值-对?你也许可以切换到nvp,比如Nvp(col2, 'ABCD','\ ~\ ', '#')
  • fshjk#3~dhaj#NON-LOCAL~dhahdate#64030~kjqiwDATE2#64030`75:~kwokdNUM#000000010652~ncdj#158672694~pwkd#410~djakj#147~xkiww#322285781~lowq #1025133646~jdoi#~pwdljae#25133648~pqeidjdt#04212016

标签: pattern-matching teradata regexp-substr


【解决方案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)

【讨论】:

  • 太棒了!它就像魅力一样。非常感谢您的帮助。
猜你喜欢
  • 2014-11-18
  • 2011-12-13
  • 2023-03-14
  • 1970-01-01
  • 2015-01-01
  • 2019-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多