我的表中的列包含以下格式的数据:
(DeliveryMethod+NON;Installation_Method+NoInstallation;Services_Reference_ID+100118547,44444,33333;Service_ID+2222)
(key+value;key+value;key+value;key+value;key+value;key+value;key+value;)
我想根据特定的"value"
从此列中搜索并提取特定的"key"
,并且"key+value"
可以在任何位置,如何使用SQL查询执行此操作?
答案 0 :(得分:0)
这是我在Oracle中接触它的一种方法:String#dasherize
。希望您可以将逻辑应用于您的RDBMS。请注意,此答案并不仅仅是从字符串中获取值,而是尝试解析字符串并返回值,以便可以像查询结果集中的行一样处理它们。对于您的方案,这可能有点过分。无论如何,它只是一种看待它的方式。
-- Original data with multiple delimiters and a NULL element for testing.
with orig_data(str) as (
select 'DeliveryMethod+NON;Installation_Method+NoInstallation;;Services_Reference_ID+100118547,44444,33333;Service_ID+2222' from dual
),
--Split on first delimiter (semi-colon)
Parsed_data(rec) as (
select regexp_substr(str, '(.*?)(;|$)', 1, LEVEL, NULL, 1)
from orig_data
CONNECT BY LEVEL <= REGEXP_COUNT(str, ';') + 1
)
-- For testing-shows records based on 1st level delimiter
--select rec from parsed_data;
-- Split the record into columns
select regexp_replace(rec, '^(.*)\+.*', '\1') col1,
regexp_replace(rec, '^.*\+(.*)', '\1') col2
from Parsed_data;
结果:
Oracle 11gR2: split string with multiple delimiters(add)
要专门回答您的问题,为了获得基于密钥的值,请将上一个查询更改为此值,以获取密钥所在的值&#39; Service_ID&#39;:
select value
from (
select regexp_replace(rec, '^(.*)\+.*', '\1') key,
regexp_replace(rec, '^.*\+(.*)', '\1') value
from Parsed_data )
where key = 'Service_ID';
结果:
或者使用正则表达式将其从字符串中提取出来:
with orig_data(str) as (
select 'Service_ID+2222;DeliveryMethod+NON;Installation_Method+NoInstallation;;Services_Reference_ID+100118547,44444,33333' from dual
)
select regexp_substr(str, '(.*?)Service_ID\+(.+?)(;|$)', 1, 1, NULL, 2) value
from orig_data;