[firebase-br] Dúvida com Between

Sandro Souza escovadordebits em gmail.com
Qui Dez 18 14:33:17 -03 2008


Bom dia/tarde Mário.

Apenas complementando sua excelente resposta.

Não é um bug, mas sim apenas entender como se comporta o operador BETWEEN.

A sintaxe básica do BETWEEN é a seguinte:

Valor BETWEEN Início AND Fim

Que é traduzido para:

(Valor >= Início) AND (Valor <= Fim)

Entendendo essa lógica, a seguinte condição:

Nome BETWEEN 'A' AND 'C'

É traduzida para:

(Nome >= 'A') and (Nome <= 'C')

Ou seja, na prática, retornará todos os nomes iniciados por 'A' e por 'B', e
também o nome que for APENAS a letra 'C', ou seja, o nome CARLOS não seria
retornado porque 'CARLOS' > 'C' e não <= 'C'.

Comparando apenas o primeiro caractere, como você fez, funciona
perfeitamente, como perfeita foi sua resposta.

Em questão de performance, implica no processamento de cada valor
(SUBSTR(NOME,1,1)) para poder então comparar com 'A' e 'C'. A não ser, é
claro, que você já esteja utilizando uma versão mais nova do Firebird que já
suporte a criação de índices baseados em expressões, e não apenas em campos
puros.

Então, se você criar um índice sobre a expressão SUBSTR(NOME,1,1), você vai
ter a melhor performance possível.

Se sua versão de Firebird ainda não suporta esse recurso, você poderia
comparar o nome da seguinte forma:

(Nome >= 'A') and (Nome < 'D')

Aí sim retornaria todos os nomes iniciados por A, B e C, mas apenas no caso
dos nomes estarem todos em maiúsculo (ou todos em minúsculo e comparando com
'a' e 'd').

Espero ter ajudado mais que atrapalhado.

2008/12/18 Mário Reis <mariodosreyx em gmail.com>

> Sim a solução parece simples.
> Porém pode tratar-se de um BUG porque se
> inclui "A" (inicio do conjunto) então lógico seria incluir igualmente "C"
> (fim do conjunto)
> Aliás, estou usando como "Tira Teimas" um sistema estável e muito
> experimentado
> DB2-400 for AS400 e confirmo:
>
> select NOME from Titulares
> where substr(NOME, 1, 1) between 'A' and 'C'
> order by NOME
>
> o meu universo inclui o conjunto de todos os
> Nomes começados por «A» até todos os
> Nomes começados por «C» inclusivé
>
> Mas atenção!!!
> Com o Firebird o resultado é o mesmo.
>
> Use a cláusula  SUBSTR(NOME , 1,1) e, pela certa vai obter o resultado
> desejado.
>
> Mário Reis
>
> 2008/12/18 Denis José <denisjosealmeida em gmail.com>
>
> > coloque between 'A' and 'D'
> >
> > 2008/12/16 Alexandre Gonçalves <info em cacula.ind.br>
> >
> > > Boa Tarde, Carlos!
> > >
> > > Tente fazer assim:
> > >
> > > where nome between 'A' and 'C'
> > > and nome starting with 'C'
> > >
> > > Abraço.
> > >
> > > Alexandre A. Gonçalves
> > > Dracena - SP
> > >
> > > Carlos Wilson escreveu:
> > >
> > >> Boa tarde,
> > >>
> > >> to precisando fazer uma consulta que me retorne por exemplo os nomes
> que
> > >> comecem com a A até C.
> > >> Fiz assim:
> > >>  where nome between 'A' and 'C'
> > >> mas me retorna apenas os nomes com A e B os nomes com C ficam
> excluidos.
> > >> o Between funciona batata com campos númericos e datas mas com strings
> > >> parece que tem um problema.
> > >> Alguem tem alguma dica de como se faz essa consulta? Uso a versão 1.5.
> > >>
> > >> Grato.
> > >>
> > >> Carlos Wilson
> > >>
> > >> ______________________________________________
> > >> 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
> > >>
> > >>
> > > ______________________________________________
> > > 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
> > >
> >
> >
> >
> > --
> > denisjose
> > ______________________________________________
> > 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
> >
>
>
>
> --
>
> C/Melhores cumprimentos
> Mário Agostinho Reis
> ______________________________________________
> 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