Problemas com comando SQL LIKE
Olá, utilizo Firebird 2.0, com Delphi 7, estou com dificuldades no seguinte, tenho uma tela de consulta de produtos, onde na minha tabela por exemplo tenho vários produtos e utilizo o seguinte comando SQL: SELECT * FROM PRODUTO WHERE DSPRODUTO LIKE %||:CAMPO||%, blz, ele traz as informações que preciso, mas estou com problemas na ordenação, por exemplo, tenho 03 produtos com a combinação BACIA, ele me traz dessa forma:
Codigo - DSPRODUTO
01 - ACUCAR COM BACIA
02 - COLUNA PARA BACIA
03 - BACIA NORMAL
mas o que o meu cliente quer que fique ordenado primeiro pela descrição digitada, onde ficaria assim:
Codigo - DSPRODUTO
03 - BACIA NORMAL
01 - ACUCAR COM BACIA
02 - COLUNA PARA BACIA
Não consegui encontrar um meio ainda de fazer, se houver alguém que possa me dar uma idéia de como resolver, ficaria muito grato!
Codigo - DSPRODUTO
01 - ACUCAR COM BACIA
02 - COLUNA PARA BACIA
03 - BACIA NORMAL
mas o que o meu cliente quer que fique ordenado primeiro pela descrição digitada, onde ficaria assim:
Codigo - DSPRODUTO
03 - BACIA NORMAL
01 - ACUCAR COM BACIA
02 - COLUNA PARA BACIA
Não consegui encontrar um meio ainda de fazer, se houver alguém que possa me dar uma idéia de como resolver, ficaria muito grato!
Cristiano
Curtidas 0
Respostas
Joel Rodrigues
26/07/2012
Como a descrição já vem com um número, acredito que você precise trazer no select apenas a parte da descrição que contém o texto e ordenar por esta coluna.
GOSTEI 0
Cristiano
26/07/2012
Olá, ali apenas postei com o código, mas são field a parte, um campo é Código, e outro é DSPRODUTO, e com o order by não fica como o desejado.
GOSTEI 0
Joel Rodrigues
26/07/2012
Você mandou ordenar pela descrição? Qual o resultado obtido?
GOSTEI 0
Anderson
26/07/2012
Bom dia, tenta assim:
select *
from
(select P.*,
(case when P.DSPRODUTO like :CAMPO||% then 0 else 1 end)||P.DSPRODUTO as DSPRODUTO_TEMPORARIO
from PRODUTOS P
where P.DSPRODUTO like %||:CAMPO||%)
order by DSPRODUTO_TEMPORARIO;
A idéia é simples, colocar uma prioridade de ordem caso o nome inicie com a palavra utilizada na busca.
Abraços,
Anderson:.
select *
from
(select P.*,
(case when P.DSPRODUTO like :CAMPO||% then 0 else 1 end)||P.DSPRODUTO as DSPRODUTO_TEMPORARIO
from PRODUTOS P
where P.DSPRODUTO like %||:CAMPO||%)
order by DSPRODUTO_TEMPORARIO;
A idéia é simples, colocar uma prioridade de ordem caso o nome inicie com a palavra utilizada na busca.
Abraços,
Anderson:.
GOSTEI 0
Cristiano
26/07/2012
Olá Joel, ele fica na ordenação normal do alfabeto, basicamente como listado no primeiro exemplo.
Olá Anderson, obrigado pelo dica, mas o comando Like no comando (case when P.DSPRODUTO like :CAMPO||% then 0 else 1 end) dá erro e portando, não consigo tb listar da forma desejada.
Se tiverem outra idéia de como poderei estar fazendo.
Olá Anderson, obrigado pelo dica, mas o comando Like no comando (case when P.DSPRODUTO like :CAMPO||% then 0 else 1 end) dá erro e portando, não consigo tb listar da forma desejada.
Se tiverem outra idéia de como poderei estar fazendo.
GOSTEI 0
Anderson
26/07/2012
Ola Moacir, o código que passei (dados os devidos ajustes - testei em uma de minhas tabelas) funcionou no Firebird Classic v2.1.5.18496 64bits (Servidor CentOS Linux 64bits) executado pelo Flamerobin v0.9.3.2219 64bits unicode (Estação Windows 7 64 bits).
Sugiro que faça um teste primeiro em uma ferramenta de banco de dados (Flamerobin, IBExpert, IBConsole, etc.) e só depois porte o código para Delphi. Teoricamente, se rodar em um destes utilitários, deverá tambem funcionar no Delphi exceto se houver alguma incompatibilidade com o componente de acesso. Caso execute o comando pelo Flamerobin e não funcionar, poste uma mensagem com o comando na integra, a linha do erro e a mensagem retornada.
Abraços,
Anderson:.
Sugiro que faça um teste primeiro em uma ferramenta de banco de dados (Flamerobin, IBExpert, IBConsole, etc.) e só depois porte o código para Delphi. Teoricamente, se rodar em um destes utilitários, deverá tambem funcionar no Delphi exceto se houver alguma incompatibilidade com o componente de acesso. Caso execute o comando pelo Flamerobin e não funcionar, poste uma mensagem com o comando na integra, a linha do erro e a mensagem retornada.
Abraços,
Anderson:.
GOSTEI 0