Sql 使用正则表达式(Oracle)从管道分隔字符串获取值
我有一个如下所示的示例源字符串,它是管道分隔格式,因为值obr可以在任何地方。我需要从第一次出现的obr中获取管道的第二个值。因此,对于下面的源字符串,预期 源字符串:Sql 使用正则表达式(Oracle)从管道分隔字符串获取值,sql,regex,oracle,regexp-replace,regexp-substr,Sql,Regex,Oracle,Regexp Replace,Regexp Substr,我有一个如下所示的示例源字符串,它是管道分隔格式,因为值obr可以在任何地方。我需要从第一次出现的obr中获取管道的第二个值。因此,对于下面的源字符串,预期 源字符串: select 'asd|dfg|obr|1|value1|end' text from dual union all select 'a|brx|123|obr|2|value2|end' from dual union all select 'hfv|obr|3|value3|345|pre|end' from dual 预
select 'asd|dfg|obr|1|value1|end' text from dual
union all
select 'a|brx|123|obr|2|value2|end' from dual
union all
select 'hfv|obr|3|value3|345|pre|end' from dual
预期产出:
value1
value2
value3
我在oracle sql中尝试了下面的regexp,但它不能正常工作
with t as (
select 'asd|dfg|obr|1|value1|end' text from dual
union all
select 'a|brx|123|obr|2|value2|end' from dual
union all
select 'hfv|obr|3|value3|345|pre|end' from dual
)
select text,to_char(regexp_replace(text,'*obr\|([^|]*\|)([^|]*).*$', '\2')) output from t;
当OBR开头时,它工作得很好,但是当OBR在中间,就像上面的样本一样,它工作得不好。
任何帮助都将不胜感激。不确定Oracle如何处理正则表达式,但以星号开头通常意味着您要查找零个或多个空字符
您是否尝试过
'^.*obr\\\|([^ |]*\\\\\\|)([^ |]*]).$'
?这将处理空元素,并包装在一个NVL()调用中,如果找不到“obr”或“obr”出现在距离记录末尾太远的地方,则该调用将提供一个值,因此不可能出现值2:
SQL> with t(id, text) as (
select 1, 'asd|dfg|obr|1|value1|end' from dual
union
select 2, 'a|brx|123|obr|2|value2|end' from dual
union
select 3, 'hfv|obr|3|value3|345|pre|end' from dual
union
select 4, 'hfv|obr||value4|345|pre|end' from dual
union
select 5, 'a|brx|123|obriem|2|value5|end' from dual
union
select 6, 'a|brx|123|obriem|2|value6|obr' from dual
)
select
id,
nvl(regexp_substr(text, '\|obr\|[^|]*\|([^|]*)(\||$)', 1, 1, null, 1), 'value not found') value
from t;
ID VALUE
---------- -----------------------------
1 value1
2 value2
3 value3
4 value4
5 value not found
6 value not found
6 rows selected.
SQL>
regex基本上可以理解为“查找管道的模式,后跟‘obr’,后跟管道,后跟零个或多个非管道字符,后跟管道,后跟零个或多个非管道字符(在捕获的组中记住),后跟管道或行尾”。然后,regexp_substr()调用返回第一个捕获的组,该组是来自“obr”的pipes 2字段之间的字符集。其工作正常。但它也与这类字符串匹配,但从技术上讲,这不应该发生a | brx | 123 | obriem | 2 | value2 | end |将其添加到您的测试数据中,然后考虑大型机或unix编辑器(例如sed),您是否可能使用了覆盖而不是插入,从而删除了“obr”后面的“\|”搜索?您的字符串是否仍然包含“…obr\ |…”或现在是“…obr([…”?您说过“obr”可以在列表中的任何位置。如果“obr”是列表中倒数第二个或最后一个呢?