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:

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:

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:

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

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

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

Link para a documentação online dessas funcionalidades.