Usando o SQL ORDER BY para critérios complexos
-
29-09-2020 - |
Pergunta
Digamos que a minha relação é assim
e eu queria ordenar por posição, mas A e B do primeiro.Então, a minha relação vai olhar como
No começo eu tentava apenas tem duas relações, em que eu, tanto de-los por classificação, em seguida, união de duas relações, mas eles acabam por ficar misturados.Eu também tentei usando casos, mas eu não consigo entender como ele funciona.Eu continuei recebendo erros sobre a mistura de caracteres com números inteiros.
Editar:Esqueci de mencionar que a primeira relação acima é o que eu acabar com o fim de um complexo número de pontos de vista.Por exemplo, eu criei dois pontos de vista, um que só tem A e B classes, então eu pedi que por categoria.Segundo visualizar apenas classes C, ordenou que pelo rank.Então eu unida-los, mas eles se misturam.
Solução
Você só precisa de um CASE
expressão ORDER BY
, para dividir as linhas em dois grupos, de modo que aqueles com classe 'A' ou 'B' são colocados no primeiro grupo (1
) e a todos os outros na segunda (2
):
ORDER BY
CASE WHEN class IN ('A', 'B') THEN 1 ELSE 2 END,
rank ;
Outras dicas
Eu vou dar a você um exemplo de uma forma de o fazer, onde eu uso CTEs, que estão disponíveis em muitas bases de dados, particularmente PostgreSQL que eu estou mais familiarizado com.
CTEs e o WITH
cláusula
CTEs permitem forma temporária, consulta única tabela de estruturas semelhantes, mas já que você pode fazer CTEs dependem de um outro em uma única consulta, ele fornece um conveniente e fácil de entender para fazer a sua consulta semi-processual.
No seu caso, gostaria de tentar
WITH AB_results AS(
SELECT class, rank, 1 AS hidden_rank
FROM my_relation
WHERE class IN ('A','B')
),
Non_AB_results AS(
SELECT class, rank, 2 AS hidden_rank
FROM my_relation
WHERE class NOT IN ('A','B')
)
SELECT COALESCE(AB_results.class,Non_AB_results.class), rank
FROM AB_results
FULL OUTER JOIN Non_AB_results
USING(hidden_rank,rank)
ORDER BY hidden_rank, rank;
Vou tentar montar um SQLFiddle em alguns minutos aqui, apenas para se certificar de que eu não tive alguns dos meus consulta errado.:P
EDITAR:Eu fiz um pequeno erro.Tentando limpá-lo com um exemplo como nós falamos.
EDIT 2:O erro agora está corrigido!Infelizmente, SQLFiddle está tendo um pouco de dificuldade, mas AQUI o link para o SQLFiddle para alguns testes.
Por favor, note que eu não possa ter resolvido isso na mais elegante possível, mas deve resolver os seus problemas.