[firebase-br] Order by com case when end

Carlos H. Cantu listas em warmboot.com.br
Qui Mar 8 09:36:24 -03 2012


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





Mais detalhes sobre a lista de discussão lista