查找最后 2 个特殊字符之间的值

问题描述

一个连接多个不同列的参考字段。我希望提取最后一个插入符号和 = 特殊字符之间的值。这些值之间没有固定长度,因此可以在 2 个字符到 100 个字符之间

我知道我们可以使用 Substr 和 Instr,但是我正在努力让它按预期工作。

字符串示例:

CONTRACT=30TEE^MCH_CODE=01.01 THIS IS A TEST^
CONTRACT=30TEE^MCH_CODE=01.01 THIS IS A TEST4545^
CONTRACT=30TEE^MCH_CODE=01.01 Testing^
CONTRACT=30TEE^MCH_CODE=01.01 This is an example45^

预期输出

01.01 THIS IS A TEST
01.01 THIS IS A TEST4545
01.01 Testing
01.01 This is an example45

解决方法

有很多方法可以做到这一点;这是一个,没有正则表达式:

SQL> with test(x) as
  2  (
  3      select 'CONTRACT=30TEE^MCH_CODE=01.01 THIS IS A TEST^' from dual union all
  4      select 'CONTRACT=30TEE^MCH_CODE=01.01 THIS IS A TEST4545^' from dual union all
  5      select 'CONTRACT=30TEE^MCH_CODE=01.01 Testing^' from dual union all
  6      select 'CONTRACT=30TEE^MCH_CODE=01.01 This is an example45^' from dual
  7  )
  8  select trim('^' from reverse(substr(reverse(x),1,instr(reverse(x),'=') -1))) x2
  9  from test;

X2
------------------------------
01.01 THIS IS A TEST
01.01 THIS IS A TEST4545
01.01 Testing
01.01 This is an example45

它是如何工作的:reverse 只是以相反的顺序给出字符串,这样搜索最后一个 '=' 就变成了在反向字符串中搜索第一个;一旦您知道最后一个/第一个 '=' 的位置,substr 就可以完成工作,您只需要使用 trim 删除最后一个字符。

您可以使用正则表达式(更紧凑但更慢):

regexp_substr(x,'([^=]+)\^$','',1)

请注意,这些是基于最后一个 '^' 是字符串的最后一个字符的假设。