Có lẽ không phải là hiệu quả nhất, nhưng nó hoạt động đệ quy (nghĩa là, nếu crit_description
bản thân nó chứa "trình giữ chỗ", chúng cũng được mở rộng. (Một giải pháp đầu tiên, đơn giản hơn những gì được hiển thị bên dưới, đã không thực hiện bước đệ quy này.) Xem đầu vào mẫu thứ ba mà tôi đã thêm. Tôi sẽ đăng lại sau nếu có thể dọn dẹp thêm.
LƯU Ý:Điều này giả định rằng tất cả "trình giữ chỗ" thực sự được tìm thấy trong criteria_info
bàn; Tôi đã không kiểm tra những gì sẽ xảy ra nếu chúng không được tìm thấy. OP để nêu yêu cầu.
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.