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)"
知道我该怎么做吗?

4

1 回答 1

1

在 Oracle 11 中,它可能如下所示:

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小提琴

于 2013-02-09T01:43:21.603 回答