- Este tópico contém 5 respostas, 4 vozes e foi atualizado pela última vez 15 anos, 9 meses atrás por
burga.
-
AutorPosts
-
17 de junho de 2010 às 2:11 am #94636
elciodba
ParticipantePessoal,
Preciso de uma função onde eu pego um caracter especial no registro e entre esse caracter eu quero
enviar uma ação.por exemplo
jose *silva* reis gostaria que quando estiver entre os ‘*’ ficasse maiusculo
jose SILVA reis
ouantonio maria *neves*
antonio maria NEVESalguem conhece uma maneira ou alguma função que faça isso?
obrigado
Marcos
17 de junho de 2010 às 5:39 am #94637Marcos Braga
ParticipanteCara…., gostei muito do desafio…
na próxima mensagem vou postar uma doideira que fiz para conseguir o que precisa, acho que funcionou. Testa no seu ambiente e retorna para nós.
Gostaria de saber a resposta.
[]s
Braga17 de junho de 2010 às 5:46 am #94638Marcos Braga
ParticipanteVamos a batalha….
Primeiro criei um ambiente para simular o que está passando:
SQL> create table t1 (c1 varchar2(50));Tabela criada.
SQL> insert into t1 values('marcos aurelio braga');
1 linha criada.
SQL> insert into t1 values('marcos aurelio braga');
1 linha criada.
SQL> insert into t1 values('marcos aurelio braga');
1 linha criada.
SQL> commit;
Commit concluído.
SQL> select * from t1;
C1
marcos aurelio braga
marcos aurelio braga
marcos aurelio bragaDepois efetuei inúmeros testes, mas sempre esbarrava em como fazer somente o código que está entre os asteriscos ficarem maiúsculos…, pesquisa vai…, pesquisa vem…, achei uma idéia que foi útil para implementar o seguinte código:
SQL> declare
2 v1 varchar2(50);
3 v2 varchar2(50);
4 v3 varchar2(50);
5 begin
for i in (select c1 from t1) loop
6 7 v1 := regexp_replace(i.c1, '(.)()(.)()(.)', '1');
8 v2 := regexp_replace(i.c1, '(.)()(.)()(.)', '3');
9 v2 := upper(v2);
10 v3 := regexp_replace(i.c1, '(.)()(.)()(.*)', '5');
11 dbms_output.put_line(v1||v2||v3);
12 end loop;
13 end;
14 /
MARCOS aurelio braga
marcos AURELIO braga
marcos aurelio BRAGAProcedimento PL/SQL concluído com sucesso.
AHHHHHHH, acho que foi… tudo que está entre os asteriscos ficaram maiúsculos… kkkkkkkkkkkkkkkkkkkkk
Nâo sei se é isso que precisa, mas poderá ter uma idéia.
Não esquecendo que utilizei expressão regular, que funciona a partir da versão 10 do Oracle.
[]s
Braga17 de junho de 2010 às 5:56 am #94639Marcos Braga
ParticipanteSei que deve ter algo mais simples utilizando o próprio REGEXP_REPLACE. Consegui algumas alternativas, mas teria que executar dois procedimentos.
Caso essa solução não atenda, avisa que continuaremos na caça.
[]s
Braga17 de junho de 2010 às 7:59 am #94642fsitja
ParticipanteFiz 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 FSITJASQL> 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 farias6 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.
17 de junho de 2010 às 9:29 pm #94658burga
ParticipanteUma alternativa mais simples e mais limitada que funciona no 10g:
select regexp_replace('antonio maria neves','(.)',
UPPER(REPLACE(
REGEXP_SUBSTR('antonio maria neves','*(.)'),'')))
from dual;Ela é limitada pois transformará em maiúsculo tudo que estiver entre o primeiro e o ultimo ‘*’ da sua string.
Mas dá pra começar a brincar a partir daí. -
AutorPosts
- Você deve fazer login para responder a este tópico.