【问题标题】:Extracting a value from a key/value pair stored in a text field从存储在文本字段中的键/值对中提取值
【发布时间】:2019-05-23 19:47:21
【问题描述】:

我需要使用 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

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

【问题讨论】:

  • 您可以通过以下方式选择最大但不包括回车的可变长度: select substr(fieldname,1,instr(fieldname,(chr(10)))) from my_table;

标签: sql oracle substring


【解决方案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是硬编码的,但是你可以用绑定变量替换它;查询需要稍微调整。如果您需要帮助,请回信。

【讨论】:

  • 完美解决方案!正是我需要的!谢谢!
【解决方案2】:

我不是 100% 确定您在寻找什么,但是

从 mytable 中选择 substr(valuet2,length(:val)+2) WHERE valuet2 LIKE :val || ';%';

将努力获得 ; 之后的所有内容之前匹配的地方:val

【讨论】:

  • 这将得到F; 之后的所有内容——包括以下所有文本行。请注意,OP 明确引用 chr(10),这表明问题中给出的示例文本是一个 single 值,而不是基表中的多个值(来自单独的行)。
猜你喜欢
  • 2019-10-04
  • 2015-08-26
  • 2019-02-27
  • 2013-06-09
  • 1970-01-01
  • 2018-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多