Извлечение значения из пары ключ / значение, хранящейся в текстовом поле - PullRequest
0 голосов
/ 23 мая 2019

Мне нужно извлечь значение из пары ключ / значение, хранящейся в текстовом поле, используя sql в Oracle 11g.

Я могу определить «ключ» с помощью

    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 ]

1 голос
/ 24 мая 2019

Вы можете использовать функции регулярных выражений и воспользоваться модификатором '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 жестко закодирован, но вы можете заменить его переменной связывания;запрос должен быть слегка подправлен.Пожалуйста, напишите, если вам нужна помощь с этим.

0 голосов
/ 23 мая 2019

Мой не уверен на 100%, что вы ищете, но

выберите подстроку (valuet2, length (: val) +2) ИЗ mytable ГДЕ valuet2 НРАВИТСЯ: val || ';%';

будет работать, чтобы получить все после; где предыдущий соответствует: val

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...