[firebase-br] Order by com case when end

Edson Marco edmafer em gmail.com
Qui Mar 8 11:08:58 -03 2012


Na procedure de produção, eu resolvi o problema criando a consulta em tempo
de execução concatenando string e depois executando com execut statement.

Resolveu o meu problema, a ordenação ficou correta... mas não achei lá uma
solução "bonita".

A soluções apresentadas acredito que resolveriam a ordenação, mas
dificultaria no meu caso já que utilizo este valor para pesquisa e
relacionamento.

Há... eu não conhecia o LPAD... certamente será útil no futuro

Obrigado.

2012/3/8 André Conrado <acf em andreconrado.net>

> Seguindo o raciocínio do Cantu, você poderia colocar T.IDTESTE em:
>
> LPAD(T.IDTESTE, 10, '0')
>
> Assim, 1 ficaria 0000000001 (tamanho igual a 10)
>
> Isso resolve seu problema.
>
> Em 8 de março de 2012 09:36, Carlos H. Cantu <listas em warmboot.com.br>
> escreveu:
> > Acredito que quando o Firebird "prepara/compila" seu select, não tem
> > como ele saber qual o tipo de informação que será usada na ordenação,
> > pois ele não tem conhecimento do valor do parâmetro ORDEM nesse
> > momento, portanto, ele adota uma ordenação "textual". Creio que o
> > único jeito de vc resolver seu problema, pelo menos mantendo a sua
> > idéia original para o select, é você formatar T.IDTESTE convertendo
> > ele pra texto com números a esquerda, atrvaés de uma UDF ou talvez
> > função interna, ex: 1 ficaria 0000001.
> >
> > []s
> > Carlos H. Cantu
> > www.FireBase.com.br - www.firebirdnews.org
> > www.warmboot.com.br - blog.firebase.com.br
> >
> > EM> Trabalhan com uma procedure, onde o campo a que vai ser ordenado o
> > EM> resultado da consulta é enviado via paramentro.
> >
> > EM> select * from stpbuscateste('I")
> >
> > EM> Nesta procedure eu tenho a seguinte consulta:
> >
> > EM>         SELECT
> > EM>             T.IDTESTE,
> > EM>             T.DESCRICAO
> > EM>         FROM
> > EM>         TESTE T
> > EM>         ORDER BY
> > EM>         CASE :ORDEM
> > EM>             WHEN 'I' THEN T.IDTESTE
> > EM>             WHEN 'V' THEN T.DESCRICAO
> > EM>         END
> >
> > EM> Para o teste estou utilizando "I" para inteiro e "V" para texto
> >
> > EM> Para a tabela com os seguintes dados:
> >
> > EM> IDTESTE DESCRICAO
> > EM> 1         ARROZ
> > EM> 2         FEIJÃO
> > EM> 3         BATATA
> > EM> 10         PICANHA
> > EM> 11         ALCATRA
> > EM> 12         COSTELA
> > EM> 20         LIMÃO
> > EM> 21         LARANJA
> > EM> 22         ABACATE
> >
> > EM> Então na consulta para o campo inteiro (IDTESTE) a ordenação é
> executada
> > EM> como se ele fosse um campo texto retornando:
> >
> > EM> IDTESTE DESCRICAO
> > EM> 1         ARROZ
> > EM> 10         PICANHA
> > EM> 11         ALCATRA
> > EM> 12         COSTELA
> > EM> 2         FEIJÃO
> > EM> 20         LIMÃO
> > EM> 21         LARANJA
> > EM> 22         ABACATE
> > EM> 3         BATATA
> >
> > EM> Tentei forçar com cast a ordenação mas o resultado é o mesmo.
> >
> > EM> Abaixo envio o script para criação do ambiente de teste que eu
> criei, caso
> > EM> alguém queira tentar reproduzir.
> >
> > EM> CREATE TABLE TESTE (
> > EM>     IDTESTE    INTEGER NOT NULL,
> > EM>     DESCRICAO  VARCHAR(32)
> > EM> );
> >
> > EM> ALTER TABLE TESTE ADD CONSTRAINT PK_TESTE PRIMARY KEY (IDTESTE);
> >
> > EM> CREATE PROCEDURE STPBUSCATESTE (
> > EM>     ORDEM CHAR(1)
> > EM> ) RETURNS (
> > EM>     IDTESTE INTEGER,
> > EM>     DESCRICAO VARCHAR(32)
> > EM> )
> > EM> AS
> > EM> BEGIN
> > EM>     FOR
> > EM>         SELECT
> > EM>             T.IDTESTE,
> > EM>             T.DESCRICAO
> > EM>         FROM
> > EM>         TESTE T
> > EM>         ORDER BY
> > EM>         CASE :ORDEM
> > EM>             WHEN 'I' THEN T.IDTESTE
> > EM>             WHEN 'V' THEN T.DESCRICAO
> > EM>         END
> > EM>         INTO
> > EM>         :IDTESTE,
> > EM>         :DESCRICAO
> > EM>     DO
> > EM>     BEGIN
> > EM>         SUSPEND;
> > EM>     END
> > EM> END
> >
> > EM> Obrigado
> >
> >
> > ______________________________________________
> > 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
>



-- 
/*
 * Edson Marco Ferrari Junior
 * edmafer em edmafer.com.br
 * http://www.edmafer.com.br
 */



Mais detalhes sobre a lista de discussão lista