2013-02-08 2 views
1

나는오라클 복잡한 문자열 대체

mytable 
type   | id  | name   | formula 
"simple"  | 1  | "COUNT"  | "<1>" 
"simple"  | 2  | "DISTINCT"  | "<2>" 
"simple"  | 3  | "mycol"  | "<3>" 
"complex" | 4  | null   | "<1>(<2> <3>)" 

이 지금은이 테이블을 읽고 수식 문자열을 대체하는 추가 열을 추가하고 싶은 다음 표를 가지고있다. ID가 4 인 경우 : "COUNT(DISTINCT mycol)"
어떻게 할 수 있습니까? 오라클 (11)

+3

으음 .... 당신이 _why_거야? 이 방법으로 다시 구성한 쿼리는 '직접'실행할 수 없습니다. 최소한 스토어드 프로 시저가 필요합니다 (SP 내부에서 이렇게하는 것이 훨씬 쉽습니다 _ _ ...). 응용 프로그램 계층에서이 작업을 수행하는 것이 가장 쉬운 방법입니다. 그러나 ** 거의 이러한 종류의 '유연성'이 필요하지 않습니다. 어떤 문제가 해결되고 있다고 생각하니? –

+0

이 예가 http://en.wikipedia.org/wiki/Inner-platform_effect입니까? –

답변

1

그것을 할 수있다 다음과 같습니다

select 
    type, id, name, formula, value 
from 
    mytable 
    left join (
     select 
     id_complex, 
     listagg(decode(pos, 2, name, part)) within group (order by occ, pos) as value 
     from 
     (
      select 
       id_complex, occ, pos, 
       regexp_replace(pair, '^(.*?)(<.*?>)$', '\'||pos) as part 
      from 
       (
        select 
        id as id_complex, 
        occ, 
        regexp_substr(formula||'<>', '.*?<.*?>', 1, occ) as pair 
        from 
        (
         select level as occ from dual 
         connect by level <= (select max(length(formula)) from mytable) 
        ), 
        mytable 
        where type = 'complex' 
       ), 
       (select level as pos from dual connect by level <= 2) 
     ) 
     left join mytable on part = formula and type = 'simple' 
     group by id_complex 
    ) on id = id_complex 
order by id 

SQL Fiddle

+0

입력 해 주셔서 감사합니다. – BaseBallBatBoy