Como faço para retornar linhas com um valor específico primeiro?

124

Quero que minha consulta retorne as linhas da tabela em que uma coluna contém um valor específico primeiro e, em seguida, retorne o restante das linhas em ordem alfabética.

Se eu tiver uma tabela, algo como este exemplo:

 - Table: Users
 - id - name -  city
 - 1    George  Seattle
 - 2    Sam     Miami
 - 3    John    New York
 - 4    Amy     New York
 - 5    Eric    Chicago
 - 6    Nick    New York

E usando essa tabela, desejo que minha consulta retorne as linhas que contêm Nova York primeiro e depois o restante das linhas em ordem alfabética por cidade. Isso é possível usando apenas uma consulta?

Phoexo
fonte
Considere alterar a resposta aceita para a segunda, se puder, pois a primeira funciona apenas para o MySQL e não para o MSSQL.
Magisch
Feito. Minha pergunta original era sobre o MySQL, mas as tags não refletiam isso de qualquer maneira.
Phoexo 6/03/2017
Obrigado. Me deparei com isso esta manhã, em um esforço para fazer algo semelhante para um problema que tive. :)
Magisch

Respostas:

195

No SQL Server, Oracle, DB2 e muitos outros sistemas de banco de dados, é isso que você pode usar:

ORDER BY CASE WHEN city = 'New York' THEN 1 ELSE 2 END, city
Rob Farley
fonte
1
Obrigado! Ajudou-me no MsSQL
Rexxo 12/09
Que realmente funciona em qualquer banco de dados SQL (e é uma solução mais limpa muito mais do que a resposta aceite na minha opinião)
a_horse_with_no_name
2
Funciona para mim no Oracle.
MonkeyWithDarts
1
E para o que eu precisava colocar 'Nova York' (ou outro valor) por último, basta trocar o 1 e o 2 ... ORDEM POR CASO QUANDO city = 'New York' THEN 2 ELSE 1 END, city
deebs
4
A ELSE 2seção significa que, enquanto Nova York obtém o valor 1, todos os outros valores obtêm o valor 2. ... pelo menos no que diz respeito à ordem de classificação.
Rob Farley
106

Se o seu dialeto SQL for inteligente o suficiente para tratar expressões booleanas como tendo um valor numérico, você poderá usar:

SELECT *
FROM `Users`
ORDER BY (`city` = 'New York') DESC, `city`
caos
fonte
1
@MehrdadAfshari: Não, o MSSQL é burro demais para processar testes de equivalência na ORDER BYcláusula.
caos
@a_horse_with_no_name: Você tentou executar a consulta acima no MSSQL?
caos
11
@chaos: a declaração acima, na verdade não não funcionam com o SQL Server, mas isso é porque a sintaxe é não-padrão e só funciona para MySQL. Ao usar uma CASEinstrução (que é o SQL padrão), o SQL Server pode muito bem usar uma expressão na ORDER BYcláusula. " estúpido demais para processar testes de equivalência " está simplesmente errado. Se em tudo o que deve ler: " não suporta a conversão implícita do MySQL de boolean trueao valor 1(um). "
a_horse_with_no_name
@ Esraa_92: Então você não tem um dialeto SQL que possa lidar com isso e precisa da resposta de Rob Farley.
caos
5
Para o Postgres, isso funcionou para mim:ORDER BY id = 123 DESC, name ASC
user1032752
4

Minha resposta pode ser antiga e não é necessária, mas alguém pode precisar de uma abordagem diferente, portanto, publicá-la aqui.

Eu tinha o mesmo requisito implementado isso, funcionou para mim.

Select * from Users
ORDER BY
(CASE WHEN city = 'New York' THEN 0 ELSE 1 END), city
GO

PS

isto é para SQL

Manjuboyz
fonte