[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