[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