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

Plsql 查找最后2个特殊字符之间的值,plsql,report,substr,plsql-package,Plsql,Report,Substr,Plsql Package,有一个连接多个不同列的引用字段。我希望提取最后一个插入符号和=特殊字符之间的值。这些值之间没有固定的长度,因此可以在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 Testi

有一个连接多个不同列的引用字段。我希望提取最后一个插入符号和=特殊字符之间的值。这些值之间没有固定的长度,因此可以在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, 1, '', 1)

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

谢谢。我以前从未用过反向,但我一定会把它放在储物柜里。他们俩都按预期工作。