Consulta SQL

11 respostas
D

Pessoal tem como alguem me explicar se eu estiver errado?

ORDER BY CASE WHEN status = 'aprovado' THEN 1 WHEN status = 'reprovado' THEN 2 WHEN status = 'liberado' THEN 3 WHEN status = 'entregue' THEN 4

O then nessa consulta defini qual a ordem da ordenção ou seja aprovados primeiro, reprovados 2 e assim sucessivamente?

11 Respostas

Hebert_Coelho

Seu case tem que estar no select e aí sim você faz o order by nele.

D

Tenho uma consulta aqui assim:

SELECT * FROM PRODUTO ORDER BY CASE WHEN status = 'aprovado' THEN 1 WHEN status = 'reprovado' THEN 2 WHEN status = 'liberado' THEN 3 WHEN status = 'entregue' THEN 4 ELSE 5 END

Só queria entender o order by

drsmachado

Este order by será definido caso o vaor da coluna status retorne um valor de 1 a 5, sendo que este último não dá ordenação alguma.
Caso status seja igual 1 até 4, ele irá ordenar pela 1ª, 2ª, 3ª ou 4ª coluna, unicamente.
Detalhe é que se este select retornar mais de 1 linha, a ordenação poderá ser inútil, pois a primeira linha pode ter status 1, a segunda, status 4 e assim por diante.

D

drsmachado:
Este order by será definido caso o vaor da coluna status retorne um valor de 1 a 5, sendo que este último não dá ordenação alguma.
Caso status seja igual 1 até 4, ele irá ordenar pela 1ª, 2ª, 3ª ou 4ª coluna, unicamente.
Detalhe é que se este select retornar mais de 1 linha, a ordenação poderá ser inútil, pois a primeira linha pode ter status 1, a segunda, status 4 e assim por diante.

O intuito do select é trazer primeiro todos aprovados depois todos reprovados depois todos liberados depois todos entregues, nao seria isso?

drsmachado

Dota:
drsmachado:
Este order by será definido caso o vaor da coluna status retorne um valor de 1 a 5, sendo que este último não dá ordenação alguma.
Caso status seja igual 1 até 4, ele irá ordenar pela 1ª, 2ª, 3ª ou 4ª coluna, unicamente.
Detalhe é que se este select retornar mais de 1 linha, a ordenação poderá ser inútil, pois a primeira linha pode ter status 1, a segunda, status 4 e assim por diante.

O intuito do select é trazer primeiro todos aprovados depois todos reprovados depois todos liberados depois todos entregues, nao seria isso?


Então não precisa do case, basta colocar o order by com a ordem que deseja trazer os resultados.
CASE é utilizado quando se quer trazer resultados que dependam de determinada condição (em geral, mais que 2, caso contrário, pode-se utilizar o IF ELSE).

A

na minha opinião sim seria isso mesmo

para alcançar o resultado de “primeiro todos aprovados depois todos reprovados depois todos liberados depois todos entregues” precisa mesmo usar o case, porque se aplicar o order by direto sobre o campo o resultado vai ser uma ordenação alfabética…

evertonsilvagomesjav

na minha opinião sim seria isso mesmo

para alcançar o resultado de “primeiro todos aprovados depois todos reprovados depois todos liberados depois todos entregues” precisa mesmo usar o case, porque se aplicar o order by direto sobre o campo o resultado vai ser uma ordenação alfabética…

Pois é como estão todos no mesmo campo status, nao vejo como fazer de outra forma, ou tem? :smiley:

A

se fosse num Oracle seria assim:

Explicando: a função decode avalia o campo que é passado no primeiro parâmetro, se o conteúdo for igual ao segundo parâmetro, retorna o terceiro parâmetro, se for igual ao quarto, retorna o quinto, e assim vai… se não for igual a nenhum retorna o último.

Alguns outros bancos implementam funções semelhantes, precisa ver a documentação de cada um

D

Ademilton, o que nao consigo entender é esse retorno ser um int(numero)
igual no case por exemplo:

order by case when status = 'aprovado' then 1

Eu nao entendo isso, o que o número 1 vai fazer?
Não entendo a execução se status for igual a aprovado então 1, como assim?

A

no campo status você tem estes valores:

‘aprovado’
‘reprovado’
‘liberado’
‘entregue’

Se aplicasse uma ordenação direta sobre o campo, ficaria

‘aprovado’
‘entregue’
‘liberado’
‘reprovado’

O que o case tá fazendo aí é substituir o valor aprovado por 1, reprovado por 2, liberado por 3, entregue por 4 e qualquer outra coisa por 5. Então aplicando a ordenação sobre estes inteiros que são resultado da substituição, você chega na ordenação conforme tá especificado.

D

Hummm Ademilton, valeu cara, todas as linhas que ele retornar ele irá substituir pelo número em questão né, e depois fazer a ordenação :smiley:

Criado 10 de maio de 2012
Ultima resposta 11 de mai. de 2012
Respostas 11
Participantes 5