Возможно, не самый эффективный, но он работает рекурсивно (то есть, если сам 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.
Отлично, спасибо – JohnHC