从存储在文本字段中的键/值对中提取值

时间:2019-05-23 19:47:22

标签: sql oracle substring

我需要使用oracle 11g中的sql从存储在文本字段中的键/值对中提取值。

我可以使用

来检测“钥匙”
    SELECT *
    FROM mytable
    WHERE valuet2 LIKE '%' || chr(10) || 'F;' || '%'

但是我不知道这是执行搜索的最佳方法,而且我不知道如何返回可变长度的值(直到但不包括回车)。

这是我需要搜索并从中提取值的文本字段。

;Please Select;*
E;Expelled
F;Expelled Following Suspension
N;In-School Suspension
S;Out-of-School Suspension
BS;Bus Suspension
101;Detention
130;Conference / Warning
131;Parent Contact / Conference
200;Loss of Recess

我正在查询存储“键”的单独表,因此我需要从此文本字段中进行查找以确定该键值代表什么。我将把这个查询推送到其他将具有其键/值对的唯一组合的其他服务器,但我无法预料它们可能是什么。因此,我无法编写解码。

2 个答案:

答案 0 :(得分:1)

您可以使用正则表达式函数并利用'm'修饰符,该修饰符指示Oracle将^$视为行首和行尾。锚点(而不是仅在字符串的开头和结尾进行匹配)。像这样:

select regexp_substr(valuet2, '^F;(.*)$', 1, 1, 'm', 1)
from   mytable
where  regexp_like(valuet2, '^F;', 'm')
;

简要演示:

create table mytable (valuet2 varchar2(4000));

insert into mytable(valuet2) values(
';Please Select;*
E;Expelled
F;Expelled Following Suspension
N;In-School Suspension
S;Out-of-School Suspension
BS;Bus Suspension
101;Detention
130;Conference / Warning
131;Parent Contact / Conference
200;Loss of Recess'
);

select regexp_substr(valuet2, '^F;(.*)$', 1, 1, 'm', 1) as myval
from   mytable
where  regexp_like(valuet2, '^F;', 'm')
;

MYVAL                                   
----------------------------------------
Expelled Following Suspension

这里F是硬编码的,但是您可以将其替换为绑定变量。查询需要稍作调整。如果需要帮助,请回信。

答案 1 :(得分:0)

我不是100%知道您要寻找的东西,但是

从mytable中选择substr(valuet2,length(:val)+2)     valuet2喜欢的地方:val || ';%';

将在;之后获取所有内容;之前匹配的地方:val