Friday, October 14, 2011

Oracle linguistic sort: desconsiderar letras minúsculas/maiúsculas e acentuação

A partir da versão 10g o Oracle passou a suportar a busca em String utilizando classificação linguística (linguistic sort). O que na prática permite a busca em um campo String desconsiderando diferenças, por exemplo, entre letras minúsculas e maiúsculas ou o uso de acentuação.

Os comandos a seguir habilitam, na sessão do usuário, a comparação por linguística e a classificação binária desconsiderando acentuação e case insensitive:

1
2
3
4
5
6
7
8
9
10
ALTER SESSION SET NLS_SORT='BINARY_AI';
ALTER SESSION SET NLS_COMP='LINGUISTIC';
 
CREATE TABLE teste (texto VARCHAR2(10));
INSERT INTO teste VALUES('Macaco');
INSERT INTO teste VALUES('maça');
INSERT INTO teste VALUES('maçarico');
INSERT INTO teste VALUES('MAÇONARIA');
 
SELECT texto FROM teste WHERE texto like 'mac%';

TEXTO
---------
Macaco
maça
maçarico
MAÇONARIA


O mesmo resultado é processado com a seguinte instrução:

1
SELECT texto FROM teste WHERE texto like 'MAÇ%';

Mesmo informando o acento, como no segundo comando, registros sem acentuação são Macaco sem acento é retornado.

O Oracle também suporta a busca ordena por um idioma:

1
SELECT texto FROM teste ORDER BY NLSSORT(texto, 'NLS_LANG = PT');

Outra funcionalidade, apresentar a descrição da data em um determinado idioma:

1
2
SELECT to_char(sysdate, 'DD/MON/YYYY', 'nls_date_language = French')
FROM dual;

Link para a documentação online dessas funcionalidades.