Pular para o conteúdo

Fóruns SQL e PL/SQL Substituir Caracteres Substituir Caracteres

#94642
fsitja
Participante

    Fiz uma solução em SQL usando a cláusula model, porém com Regexp_Count, que só existe no Oracle 11g.


    Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.1.0
    Connected as FSITJA

    SQL> with tab as (
    2 select 'joao pereira dos santos' nome from dual union
    3 select 'jose silva reis' nome from dual union
    4 select 'jose silva reis farias' nome from dual union
    5 select '
    fatima* oliveira' nome from dual union
    6 select 'teresinha freitas almeida' nome from dual union
    7 select 'antonio maria neves' from dual)
    8 -- fim dos dados de exemplo, início do SQL
    9 --
    10 select n as nome, n2 as novo_nome
    11 from (select nome,
    12 row_number() over (order by 1) id,
    13 max(regexp_count(nome, '(([^]+)|([^]))')) over () max_cnt
    14 from tab)
    15 model dimension by (id as i)
    16 measures (cast(null as varchar2(4000)) as n2, cast(null as number) x, nome as n, max_cnt as mc, nome as p)
    17 rules update iterate (100) until iteration_number >= mc[1] - 1
    18 (
    19 x[any] = iteration_number,
    20 p[any] = regexp_substr(n[cv(i)], '(([^]+)|([^*]
    ))', 1, iteration_number + 1),
    21 n2[any] = n2[cv(i)] || case when regexp_like(p[cv(i)], '^
    .**$')
    22 then upper(rtrim(ltrim(p[cv(i)], ''), ''))
    23 else p[cv(i)] end
    24 );

    NOME NOVO_NOME


    fatima oliveira FATIMA oliveira
    teresinha freitas almeida TERESINHA freitas ALMEIDA
    antonio maria neves antonio maria NEVES
    joao pereira dos santos joao PEREIRA dos SANTOS
    jose silva reis jose SILVA reis
    jose silva reis *farias jose SILVA reis farias

    6 rows selected

    SQL>

    Acho que daria para fazer também sem o regexp_count para funcionar no 10g, mas tem que pensar um pouco mais numa gambiarra para simular a funcionalidade.