[firebase-br] Order by com case when end

André Conrado acf em andreconrado.net
Qui Mar 8 10:59:58 -03 2012


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




Mais detalhes sobre a lista de discussão lista