2016-08-30 3 views
1

У меня есть поле, который заполняется с серией критериев в определенном формате:Заменить часть поля со значениями из запроса

CRITERIA 
$1 = True 
$2 > $3 

Информация критерии хранится в таблице

CRIT_ID CRIT_DESCRIPTION 
1  Example 1 
2  Example 2 
3  Example 3 

Конечный результат должен выглядеть следующим образом:

CRITERIA 
Example 1 = True 
Example 2 > Example 3 

Может ли кто-нибудь предложить, как это сделать? Я пробовал ЗАМЕНИТЬ и работал с REGEXP_REPLACE до сих пор ...

ответ

2

Возможно, не самый эффективный, но он работает рекурсивно (то есть, если сам crit_description содержит «заполнителей», те, разлагаются, а также. (Первое решение, проще, чем то, что показано ниже, не сделайте этот рекурсивный шаг.) См. третий пример ввода, который я добавил. Я отправлю его позже, если я смогу его еще немного очистить.

ПРИМЕЧАНИЕ. Предполагается, что все «заполнители» фактически находятся в таблице criteria_info; не проверял, что произойдет, если они не будут найдены. OP, чтобы указать это требование.

with 
    inputs (criteria) as (
     select '$1 = True' from dual union all 
     select '$2 > $3' from dual union all 
     select '$1 = $4' from dual 
    ), 
    criteria_info (crit_id, crit_description) as (
     select 1, 'Example 1' from dual union all 
     select 2, 'Example 2' from dual union all 
     select 3, 'Example 3' from dual union all 
     select 4, '$2 + $3' from dual 
    ), 
    rec (criteria, new_str) as (
     select criteria, criteria 
     from inputs   
     union all  
     select r.criteria, 
       regexp_replace(r.new_str, '\$\d+', c.crit_description, 1, 1) 
     from rec r inner join criteria_info c 
       on to_number(regexp_substr(r.new_str, '\$(\d+)', 1, 1, null, 1)) = c.crit_id 
     where regexp_substr(r.new_str, '\$\d+') is not null 
    ) 
select criteria, new_str 
from rec 
where regexp_substr(new_str, '\$\d+') is null 
; 


CRITERIA NEW_STR 
--------- ------------------------------------ 
$1 = True Example 1 = True 
$2 > $3 Example 2 > Example 3 
$1 = $4 Example 1 = Example 2 + Example 3 

3 rows selected. 
+0

Отлично, спасибо – JohnHC

0

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

SELECT B.CRIT_DESCRIPTION || SUBSTR(A.CRITERIA, INSTR(A.CRITERIA, ' ')) 
    FROM A, B 
WHERE TO_NUMBER(SUBSTR(A.CRITERIA, 2, INSTR(A.CRITERIA, ' ') - 2)) = B.CRIT_ID 
+0

Спасибо Neria, но это не допускает появления нескольких критериев в поле (см. Строку 2). – JohnHC

+0

Он также выходит из строя во время выполнения с исключением «недопустимого числа». Вы проверяли код перед его публикацией? – mathguy

+0

@mathguy Спасибо, я исправил последний параметр в 'SUBSTR' WHERE. –

Смежные вопросы