[firebase-br] RES: Order by com case when end

Matheus Guerra Gmail matheus.oliveira.guerra em gmail.com
Sex Mar 9 11:23:13 -03 2012


Bom dia Edson,
Segue abaixo query que acho que vai te ajudar,

CREATE TABLE TESTE (
    IDTESTE    INTEGER NOT NULL,
    DESCRICAO  VARCHAR(32)
);

ALTER TABLE TESTE ADD CONSTRAINT PK_TESTE PRIMARY KEY (IDTESTE);

CREATE PROCEDURE STPBUSCATESTE (
    ORDEM CHAR(1)
) RETURNS (
    IDTESTE INTEGER,
    DESCRICAO VARCHAR(32)
)
AS
BEGIN
    FOR
        SELECT
            T.IDTESTE,
            T.DESCRICAO
        FROM
            TESTE T
        WHERE :ORDEM = 'I'
        ORDER BY T.INDTESTE

        UNION

        SELECT
            T.IDTESTE,
            T.DESCRICAO
        FROM
            TESTE T
        WHERE :ORDEM = 'V'
        ORDER BY T.DESCRICAO

        INTO
        :IDTESTE,
        :DESCRICAO
    DO
    BEGIN
        SUSPEND;
    END
END

Att, 
Matheus Guerra


-----Mensagem original-----
De: lista-bounces em firebase.com.br [mailto:lista-bounces em firebase.com.br] Em
nome de Edson Marco
Enviada em: quinta-feira, 8 de março de 2012 09:16
Para: lista em firebase.com.br
Assunto: [firebase-br] Order by com case when end

Trabalhan com uma procedure, onde o campo a que vai ser ordenado o resultado
da consulta é enviado via paramentro.

select * from stpbuscateste('I")

Nesta procedure eu tenho a seguinte consulta:

        SELECT
            T.IDTESTE,
            T.DESCRICAO
        FROM
        TESTE T
        ORDER BY
        CASE :ORDEM
            WHEN 'I' THEN T.IDTESTE
            WHEN 'V' THEN T.DESCRICAO
        END

Para o teste estou utilizando "I" para inteiro e "V" para texto

Para a tabela com os seguintes dados:

IDTESTE DESCRICAO
1         ARROZ
2         FEIJÃO
3         BATATA
10         PICANHA
11         ALCATRA
12         COSTELA
20         LIMÃO
21         LARANJA
22         ABACATE

Então na consulta para o campo inteiro (IDTESTE) a ordenação é executada
como se ele fosse um campo texto retornando:

IDTESTE DESCRICAO
1         ARROZ
10         PICANHA
11         ALCATRA
12         COSTELA
2         FEIJÃO
20         LIMÃO
21         LARANJA
22         ABACATE
3         BATATA

Tentei forçar com cast a ordenação mas o resultado é o mesmo.

Abaixo envio o script para criação do ambiente de teste que eu criei, caso
alguém queira tentar reproduzir.

CREATE TABLE TESTE (
    IDTESTE    INTEGER NOT NULL,
    DESCRICAO  VARCHAR(32)
);

ALTER TABLE TESTE ADD CONSTRAINT PK_TESTE PRIMARY KEY (IDTESTE);

CREATE PROCEDURE STPBUSCATESTE (
    ORDEM CHAR(1)
) RETURNS (
    IDTESTE INTEGER,
    DESCRICAO VARCHAR(32)
)
AS
BEGIN
    FOR
        SELECT
            T.IDTESTE,
            T.DESCRICAO
        FROM
        TESTE T
        ORDER BY
        CASE :ORDEM
            WHEN 'I' THEN T.IDTESTE
            WHEN 'V' THEN T.DESCRICAO
        END
        INTO
        :IDTESTE,
        :DESCRICAO
    DO
    BEGIN
        SUSPEND;
    END
END

Obrigado
--
/*
 * 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