2013-02-08 4 views
1

J'ai le tableau suivantremplacement de chaîne Oracle complexe

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

Maintenant, je voudrais lire ce tableau et d'ajouter une colonne supplémentaire qui remplace la chaîne de formule. Pour l'id 4 je voudrais: "COUNT(DISTINCT mycol)"
Une idée de comment je peux faire cela?

+3

uhh .... _why_ tu fais ça? Notez que vous ne serez pas en mesure d'exécuter directement une requête que vous reconstituerez de cette façon; vous aurez besoin d'une procédure stockée au minimum (à ce stade, il va être beaucoup plus simple de le faire dans le SP _anyways _...). Vous pouvez avoir le temps le plus facile en faisant cela dans votre couche d'application. Cependant, ** rarement ** est ce type de «flexibilité» nécessaire; Quel problème pensez-vous que vous résolvez? –

+0

Est-ce un exemple de http://en.wikipedia.org/wiki/Inner-platform_effect? –

Répondre

1

Dans Oracle 11, il peut ressembler à ceci:

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

merci pour votre contribution! – BaseBallBatBoy