SQL: Ordenação avançada por comparação

Alerta Nerd: a seguir informações técnicas para desenvolvedores!

Usando a lógica booleana nas consultas SQL podemos ordenar consultas de banco de dados de uma forma bastante criativa.

Uso normal do Order By

Normalmente usamos a cláusula ORDER BY para tarefas comuns, por exemplo, podemos fazer a listagem de cidades ordenadas pelo nome:

Colocando o registro mais útil no início

No entanto, as vezes é mais interessante colocar alguns resultados especiais no topo da listagem, para facilitar o acesso dos usuários do sistema.

Por exemplo, num sistema para compra de passagens intermunicipais, você poderia colocar a capital do estado e as cidades próximas em primeiro, e depois as demais cidades em ordem alfabética.

Abaixo uma forma de fazer isso, utilizando uma só consulta:

São duas 2 condições de ordenação, a primeira inclui a cidades que desejamos em primeiro lugar. Como pode ver, foi usado o comparativo diferente <>, isso se explica pela lógica booleana. VERDADEIRO = 1, FALSO = 0.

Para maior clareza, podemos usar o símbolo de igual e inverter a ordenação da primeira cláusula, com o operador DESC (ordem decrescente):

Múltiplos registros no início

Caso precisarmos incluir mais cidades, podemos ampliar a primeira cláusula. Não precisamos, todavia, comparar os nomes, se tivermos os IDs também é possível simplificar a busca com o comparativo IN:

Note que mesmo os 4 primeiros resultados são ordenados também por nome (ordem alfabética), pois é o segundo critério do comparativo.

Em que cidades estão a maioria dos meus clientes?

Outros usos mais complexos podem ser feitos. Por exemplo, se o seu vendedor precisar criar um cadastro novo, que tal mostrar as cidades com mais clientes em primeiro lugar, e depois as demais cidades?

Para conseguir isso precisamos contabilizar os clientes com um LEFT JOIN, pois podem existir cidades sem qualquer cliente.

Order By simples pelo número de clientes

Abaixo um exemplo de como faríamos para simplesmente ordenar as cidades pela quantidade de clientes:

O problema neste tipo de consulta é que para encontrar uma cidade que não tenha tantos clientes será mais difícil, pois os dados mais abaixo não tem ordenação lógica.

Por exemplo, uma cidade com apenas 3 clientes está em algum lugar no meio da lista, e o vendedor terá que ler os itens um por um até encontrar o item desejado.

Comparando quantidades de registros

Vamos arrumar isso ordenando as cidades com mais de 100 clientes em primeiro, e as demais alfabeticamente, utilizando ORDER BY + COMPARAÇÃO:

No resultado da consulta podemos distinguir duas listas: a primeira com as cidades principais, e a segunda com as demais cidades.

A ordenação secundária se dá por ordem alfabética.

Considerações finais

Este é um recurso que pode ser bem útil, principalmente para ajudar na experiência dos usuários do sistema.

Ele evita ter que fazer 2 consultas separadas ou mesmo utilizar 2 selects com UNION, e isso traz um ponto positivo que é a simplificação da consulta no que diz respeito à sua manutenção de código.

É preciso verificar se este tipo de consulta pode causar algum impacto na performance das suas consultas.

Este comportamento do Order By + Comparação não funciona em todos os tipos de bancos de dados, mas já pude realizar testes no MySQL e no SQLite do Android com sucesso.

Outros bancos de dados podem oferecer formas alternativas, por exemplo, fiz o seguinte teste no Firebird 2.1, utilizando a função IIF(), e gerando um tipo de consulta que a gente vê com mais frequencia por aí! 😉

Explicando: Order By 1 significa ordenar pela primeira coluna, que no caso é o resultado da função IIF().