2013-10-03 2 views
1

다음은 내가 해결하려고하는 문제입니다 (Oracle v10g +).
표 1 데이터 :오라클 재귀 SELECT

ID  Text_Formula  
1   'FIELD1 = XYZ + ABC' 

표 2 데이터 :

ID  Formula_Component  Actual_Component  
1    XYZ     a.br_width  
1    ABC     b.br_height 

원하는 결과 :

ID  Text_Formula  
1  'FIELD1 = a.br_width + b.br_height' 

표 2 행의 수를 가질 수있다. LEAD, LAG, xmlagg를 REPLACE와 함께 사용하여 변형을 시도해 봤지만 아무런 효과가 없었습니다. 모든 포인터가 크게 감사하겠습니다!

+0

참조 [스택 오버플로 게시물에 SQL 테이블을 포맷하는 방법?] (http://meta.stackexchange.com/q/96125/148672) 테이블. –

답변

0

이 작업을위한 함수를 만들고이 함수를 table1의 select 쿼리에서 사용해야한다고 생각합니다. 함수는 다음과 같아야합니다.

create or replace function transform_data(p_input in varchar2) return varchar2 
is 
    v_result varchar2(2000); 
    v_col_value varchar2(200); 
begin 
    v_result := p_input; 

    for rec in (select * from table2) 
    loop 
     if instr(v_result, rec.Formula_Component) > 0 then 
      v_result := replace(v_result, rec.Formula_Component, rec.Actual_Component); 
     end if; 
    end loop; 

    return v_result; 
end; 
+0

고마워요.이 트릭을 할 것입니다. 나는 SQL을 선호하지만 나는 함수에 사임하고있다. 소량의 데이터가 주어지면 함수가 문제가되어서는 안됩니다. 다시 한 번 감사드립니다! – PaulS

0
select id, replace(formula, chr(0)) as text_formula from (
    select 
    id, rn, regexp_replace(text_formula, '(\w+)', chr(0)||'\1'||chr(0)) formula 
    from t1 natural join (select id, count(0) rn from t2 group by id) 
) model 
reference dic on (
    select 
    id, 
    chr(0)||formula_component||chr(0) as term, 
    actual_component as value, 
    row_number() over (partition by id order by null) as rn 
    from t2 
) dimension by (id, rn) measures (term, value) 
partition by (id) dimension by (1 x) measures (formula, rn) 
rules iterate (1000000) until (rn[1] <= 0) (
    formula[1] = replace(formula[1], term[cv(id), rn[1]], value[cv(id), rn[1]]), 
    rn[1] = rn[1] - 1 
) 
형식으로 쉬운 방법에 대한

fiddle