RE: [oracle_br] Duvida na construção de select para localizar um Nome com ou sem acento (JOÃO e JOAO)

2016-12-13 Por tôpico 'Schiavini' et...@schiavini.inf.br [oracle_br]
A solução que eu sugeri pode ser utilizada na aplicação, o problema são os 
efeitos colaterais que ela pode trazer a todo o código preexistente já que o 
resultados de todas as demais consultas poderão ser diferentes do esperado.

 

Como tu citou que o problema principal após a utilização de uma função para 
remover a acentuação foi a performance, tu pode criar um function based index:

https://docs.oracle.com/cd/B28359_01/server.111/b28310/indexes003.htm#i1006674

 

Se a necessidade de consulta for bem específica (apenas em uma ou em poucas 
tabelas), outra opção é criar uma coluna extra - calculada ou não - que 
armazene o nome sem acentuação.

 

Étore Schiavini 

 

From: oracle_br@yahoogrupos.com.br [mailto:oracle_br@yahoogrupos.com.br] 
Sent: terça-feira, 13 de dezembro de 2016 23:50
To: oracle_br@yahoogrupos.com.br
Subject: RE: [oracle_br] Duvida na constr ução de select para localizar um Nome 
com ou sem acento (JOÃO e JOAO)

 

  

Étore Schiavini, boa noite.

 

eu preciso para implementar na aplicação, você tem uma outra sugestão para meu 
problema?





[As partes desta mensagem que não continham texto foram removidas]



RE: [oracle_br] Duvida na construção de select para localizar um Nome com ou sem acento (JOÃO e JOAO)

2016-12-13 Por tôpico 'Schiavini' et...@schiavini.inf.br [oracle_br]
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