› Fóruns › SQL e PL/SQL › Substituir Caracteres › Substituir Caracteres
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.