用查询中的值替换部分字段

时间:2016-08-30 10:23:49

标签: sql oracle

我有一个字段,其中填充了一系列特定格式的标准:

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

有谁能建议如何最好地完成这项工作?到目前为止,我已尝试使用REPLACE并涉及REGEXP_REPLACE ......

2 个答案:

答案 0 :(得分:2)

也许不是最有效的,但它以递归方式工作(也就是说,如果crit_description本身包含"占位符",那些也会被扩展。(第一个解决方案,比#&更简单) 39;如下所示,没有做这个递归步骤。)看到我添加的第三个样本输入。如果我可以再清理它,我会稍后再发布。

注意:这假定所有"占位符"实际上是在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.

答案 1 :(得分:0)

在下面的查询中,我使用第一个SPACE作为id和等式之间的分隔符(并假设id总是从第二个char开始)。

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