Daniel
Se tu puder alterar as configurações da sessão (se for pra rodar um script
avulso e não pra implementar isto na aplicação) a solução pode ser simples:
SQL> create table t( c varchar2(30) );
Table created.
SQL> insert into t values( 'Joao' );
1 row created.
SQL> insert into t values( 'JOAO' );
1 row created.
SQL> insert into t values( 'João' );
1 row created.
SQL> insert into t values( 'JOÃO' );
1 row created.
SQL> select c from t where c like '%JOAO%';
C
--
JOAO
SQL> ALTER SESSION SET NLS_COMP=LINGUISTIC;
Session altered.
SQL> ALTER SESSION SET NLS_SORT=BINARY_AI;
Session altered.
SQL> select c from t where c like '%JOAO%';
C
--
Joao
JOAO
João
JOÃO
Pode-se criar um índice linguístico na coluna:
create index TCI on T( nlssort( C, 'NLS_SORT=BINARY_AI' ) );
Mas com esse % no início do argumento do like ele não vai ser utilizado.
Étore Schiavini
From: oracle_br@yahoogrupos.com.br [mailto:oracle_br@yahoogrupos.com.br]
Sent: terça-feira, 13 de dezembro de 2016 15:24
To: oracle_br@yahoogrupos.com.br
Subject: [oracle_br] Duvida na construção de select para localizar um Nome com
ou sem acento (JOÃO e JOAO)
Boa tarde amigos, pode parecer simples para alguns que detêm grande
conhecimento em oracle e SQL, mas eu não consegui encontrar uma saída.
Tenho uma tabela de entidades onde um dos campos é o nome, e no mesmo temos
nomes com e sem acento.
Preciso fazer uma busca na coluna para localizar independente do nome ter ou
não acento, por exemplo JOÃO, tenho casos gravados tanto com acento como sem.
Criei então uma function para tirar os acentos, e usei a mesma na clausula
WHERE, no entanto, tive uma queda brusca de desempenho, pois com a function
perco a indexação.
esta é a function
CREATE OR REPLACE FUNCTION SF_FLRETIRARACENTUACAO(PSTRING IN VARCHAR2)
RETURN VARCHAR2 IS
VSTRINGRETURN VARCHAR2(4000);
BEGIN
VSTRINGRETURN := TRANSLATE(PSTRING,
'ÁÇÉÍÓÚÀÈÌÒÙÂÊÎÔÛÃÕËÜáçéíóúàèìòùâêîôûãõëü''',
'ACEIOUAEIOUAEIOUAOEUaceiouaeiouaeiouaoeu');
RETURN VSTRINGRETURN;
END;
Este era meu where
where sf_flretiraracentuacao(nm_entidade) LIKE
sf_flretiraracentuacao('%JOÃO%')
Existe uma outra maneira de se fazer essa busca?
Alguém tem alguma sugestão?
Grato,
Daniel Mota