[firebase-br] Like - Case insensitive

Sandro Souza escovadordebits em gmail.com
Qui Dez 4 10:25:37 -03 2008


Bom dia/tarde Fabrício.

Nas versões mais novas do Firebird, você já pode criar índices baseados em
expressões.

Sendo assim, você pode, por exemplo, criar um índice baseado na expressão
UPPER(NOME) e ele será utilizado nesse caso que você informou.

Usando o próprio "isql.exe", vamos criar um exemplo.

Primeiro vamos "logar" no isql como "sysdba", senha "masterkey" e dialeto 3.

isql -u sysdba -p masterkey -s 3

Use CONNECT or CREATE DATABASE to specify a database
SQL>

Conectando em um banco de testes...

SQL>connect teste;
Database:  teste, User: sysdba
SQL>

Criando a nossa tabela de exemplo...

SQL>create table teste (nome varchar(30) not null);

Acrescentando alguns registros...

SQL>insert into teste values('joão');
SQL>insert into teste values('JoÃo');
SQL>insert into teste values('jOãO');
SQL>insert into teste values('JOÃO');

Efetivando a transação...

SQL>commit;

Verificando se os dados realmente foram salvos...

SQL>select * from teste;

NOME
==============================
joão
JoÃo
jOãO
JOÃO

Ativando a exibição dos planos de acesso...

SQL>set plan on;

Criando o índice baseado em uma expressão...

SQL>create index *ix_teste* on teste *computed by (upper(nome))*;

Efetuando a seleção de dados pelas iniciais do nome...

SQL>select * from teste where upper(nome) like 'JO%';

*PLAN (TESTE INDEX (IX_TESTE))*

NOME
==============================
joão
JoÃo
jOãO
JOÃO

Dessa forma, o índice criado é utilizado.

Espero ter ajudado mais que atrapalhado. :D

2008/12/4 Fabrício Fadel Kammer <ffkammer em conchalnet.com.br>

> Bom dia pessoal,
>
> Hoje para poder usar o comando LIKE sem diferenciar maiúsculas de
> minúsculas acrescento o um Upper na condição, conforme sql abaixo:
>
> SELECT NOME FROM CLIENTES WHERE UPPER(NOME) LIKE 'JO%'
>
> Isso faz com que o LIKE retorne TODOS os clientes cujo nome inicie com
> "JO", porém o Firebird não utiliza índices nessa busca. Gostaria de saber
> com os colegas se há como eu fazer o like não diferenciar maiúsculas de
> minúsculas, obrigando assim o Firebird a usar o índice do campo nome e
> ganhar performance nessa SQL?
>
> Queria fazer algo como abaixo:
>
> SELECT NOME FROM CLIENTES WHERE NOME LIKE 'JO%'
>
> E o Firebird deveria retornar todos registros abaixo:
> Joao
> JOao
> JOAO
> Jose
> JOSE
> JOsE
> etc
>
> Grato desde já
>
> Fabrício
>
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use:
> http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>



Mais detalhes sobre a lista de discussão lista