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

Sql 从存储在文本字段中的键/值对中提取值,sql,oracle,substring,Sql,Oracle,Substring,我需要使用oracle 11g中的sql从存储在文本字段中的键/值对中提取值 我可以用手指检测“钥匙” 但我并不确定这是进行搜索的最佳方式,我不知道如何返回可变长度的值(最多,但不包括回车) 这是我需要搜索并从中提取值的文本字段 ;Please Select;* E;Expelled F;Expelled Following Suspension N;In-School Suspension S;Out-of-School Suspension BS;Bus Suspension 101;Det

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

我可以用手指检测“钥匙”

但我并不确定这是进行搜索的最佳方式,我不知道如何返回可变长度的值(最多,但不包括回车)

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

;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

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

我的计算机无法100%确定您在寻找什么,但是

从mytable中选择substr(值2,长度(:val)+2) 其中值2类似于:val | |';%'


工作后会得到一切;如果before匹配:val

您可以使用正则表达式函数并利用
'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
是硬编码的,但是您可以用bind变量替换它;这个查询需要稍微调整一下。如果您需要帮助,请回信。

您可以通过以下操作选择长度不超过但不包括回车符的变量:从my_表中选择substr(fieldname,1,instr(fieldname,(chr(10))));这将得到
F之后的所有内容-包括以下所有文本行。请注意,OP明确引用了
chr(10)
,这表明问题中给出的示例文本是基表中的单个值,而不是多个值(来自单独的行)。完美的解决方案!正是我需要的!非常感谢。
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