Oracle 12cR1
我有一列包含如下所示的长字符串
:Key1:Value1:Key2:Value2:Key3:Value3:Key4...…..
键是唯一的数字。这些值是任何字符串值,甚至可以是与任何其他键相同的数字。如果我提供密钥,我必须获得其相应的值。例如,
lengthy_str_col := ':101:abc:12:43:43:101.4:4:bus'
为了获取键的值43,我尝试了以下操作。
SELECT REGEXP_SUBSTR(lengthy_str_col,'(:([^:])+)(:[^:]+)') FROM DUAL;
这给了我第一个键值对':1:abc'
。现在我知道第三个键是43,
SELECT REGEXP_SUBSTR(lengthy_str_col,'(:([^:])+)(:[^:]+)', 1, 3, 'i', 4) FROM DUAL;
获取键101.4
的值43
。
但是所需的键可以位于任意随机位置。有没有一种方法可以获取任何给定键的值?
答案 0 :(得分:4)
您可以使用
select REGEXP_SUBSTR(':101:abc:12:43:43:101.4:4:bus', '^(:[^:]+:[^:]+)*?:43:([^:]+)', 1, 1, NULL, 2) as Result from dual
请参见this regex demo和this regex graph:
说明
^
-字符串的开头(:[^:]+:[^:]+)*?
-出现零个或多个,但尽可能少的:
和除:
以外的1个以上字符的两次重复:43:
-冒号之间的键([^:]+)
-第2组(结果)::
以外的1个或更多字符