A idéia inicial deste post é trabalhar com ordem desordenada! Não se surpreenda, nem diga que estou louco, mas o que estou tratando é algo comum do dia-a-dia.
Vamos à situação, imagina que você possui uma tabela de categoria de produtos, com os seguintes dados:
| Código | Nome |
| 1 | Sapatos |
| 2 | Cintos |
| 3 | Chapeis |
| 4 | Calçar |
| 5 | Casacos |
| 6 | Camisas |
| 7 | Meias |
| 8 | Pijamas |
| 9 | Outros |
Mas agora o cliente deseja que sempre a categoria “Outros” apareça em primeiro em um determinado relatório. Ok, você em minutos vai à query:
SELECT Código, Nome FROM CategoriaE altera para:
SELECT Código, Nome FROM Categoria ORDER BY Código DESCResultado disso, agora o cliente te avisa que quer as categorias bagunçadas… Possivelmente isso quer dizer, que ele quer que a categoria “Outros” fique como primeira, mas que as outras continuem em alguma ordem (possivelmente por nome). Agora temos as seguintes soluções:
Criar uma coluna nova na tabela para determinar a ordem da tabela? Ok, é uma ótima idéia, se você possui acesso para alterar a estrutura das tabelas do banco de dados. Sem contar que será necessário reordenar os valores da coluna a cada nova categoria.
| Código | Nome | Ordem |
| 1 | Sapatos | 9 |
| 2 | Cintos | 6 |
| 3 | Chapeis | 5 |
| 4 | Calçar | 2 |
| 5 | Casacos | 4 |
| 6 | Camisas | 3 |
| 7 | Meias | 7 |
| 8 | Pijamas | 8 |
| 9 | Outros | 1 |
Ou fazer união do registro “Outros” com os outros resultados:
SELECT Código, Nome FROM Categoria
WHERE Código = 9
UNION
SELECT Código, Nome FROM Categoria
WHERE Código <> 9Ok, não funcionou a união… Então o jeito é apelar:
SELECT Código, Nome, '' AS Ordem FROM Categoria
WHERE Código = 9
UNION
SELECT Código, Nome, Nome AS Ordem FROM Categoria
WHERE Código <> 9
ORDER BY OrdemBem, segue agora minha idéia de solução, ela executa 20% mais rápido, possui um plano de execução bem menor, mais a facilidade de manutenção:
SELECT Código, Nome FROM Categoria
ORDER BY
CASE Código
WHEN 8 THEN ''
ELSE Nome
END;Propostas as soluções, agora é escolher a melhor e aplicá-la.
A possibilidade de usar CASE ou funções para ordenação permite solucionar necessidades diversas de ordenação, como gerar uma consulta ordenada aleatoriamente:
SELECT * FROM Tabela
ORDER BY NEWID()E algumas queries estranhas:
SELECT * FROM Tabela
ORDER BY
CASE
WHEN Código > 5 THEN 0 – Código
ELSE Código
END;Se alguém tiver alguma outra proposta, por favor, informem.
Até o próximo post!