SQL PLSQL Как создать поиск по значениям, взятым из строкового столбца - PullRequest
0 голосов
/ 20 декабря 2018

Я noobie в PL / SQL, и я борюсь с проблемой ниже

Мой код выглядит так:

select view1.col1 from view1

Col1 это строковый столбец.Запрос извлекает следующие 2 записи.

view1.col1
-----------------
Foo [40] boo boo foo [11] loo [abc]
Loo [2] foo foo [a31] foo boo [32]

есть еще одна словарная таблица для числовых значений, присутствующих в view1.col1

таблица 2

ID|Description|
1 | A
2 | G2
3 | C4
32| EE2
11| AA2
40| U1
99| ZZ6 

У меня естьдругая таблица, к которой я хотел присоединиться, чтобы заменить только числовые значения в скобках [] в моих примерах с номерами [40], [11], [2], [32] описательным значением из table2.col2

Я хотел бы, чтобы результат моего кода был извлечен

-----------------
Foo U1 boo boo foo AA2 loo [abc]
Loo G2 foo foo [a31] foo boo EE2

1 Ответ

0 голосов
/ 20 декабря 2018

Это довольно сложная проблема для новичка в PL / SQL.Для получения правильного ответа требуется несколько встроенных программ Oracle.

В любом случае, вот функция, которая делает это.Он использует регулярные выражения для подсчета, поиска и замены заполнителей.Следовательно, производительность может быть не блестящей, но она должна быть приемлемой.

create or replace function substitution (p_str in varchar2) 
    return varchar2
as
    rv varchar2(4000);
    cnt pls_integer;
    l_id t2.id%type;
    l_sub t2.description%type;
begin
    rv := p_str;
    cnt := regexp_count(p_str, '\[([[:digit:]]+)\]');
    if cnt > 0 then
        for idx in 1..cnt loop
            l_id := to_number(rtrim(ltrim( regexp_substr(p_str, '\[([[:digit:]]+)\]', 1, idx ), '['),']'));
            select description 
            into l_sub
            from t2
            where id = l_id;
            rv := regexp_replace(rv, '\[([[:digit:]]+)\]', l_sub, 1, idx );
        end loop;
    end if;
    return rv;
end;
/

Вы называете это так:

select col1 as old_col
       , substitution(col1) as new_col
from view1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...