[firebase-br] Order by com case when end

André Conrado acf em andreconrado.net
Qui Mar 8 11:31:08 -03 2012


Você só precisa usar da ordenação, na pesquisa você usaria o campo diretamente.

Em 8 de março de 2012 11:08, Edson Marco <edmafer em gmail.com> escreveu:
> 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
>  */
> ______________________________________________
> 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