Come restituisco prima le righe con un valore specifico?


124

Voglio che la mia query restituisca le righe della tabella in cui una colonna contiene prima un valore specifico, quindi restituisca il resto delle righe in ordine alfabetico.

Se ho una tabella simile a questo esempio:

 - 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 quella tabella voglio che la mia query restituisca le righe che contengono prima New York e poi il resto delle righe in ordine alfabetico per città. È possibile farlo utilizzando una sola query?


Considera la possibilità di cambiare la risposta accettata alla seconda, se puoi, poiché la prima funziona solo per MySQL e non per MSSQL.
Magisch

Fatto. La mia domanda originale riguardava MySQL, ma i tag non lo riflettevano comunque.
Phoexo

Grazie. Mi sono imbattuto in questo questa mattina nel tentativo di fare qualcosa di simile per un problema che avevo. :)
Magisch

Risposte:


195

Su SQL Server, Oracle, DB2 e molti altri sistemi di database, questo è ciò che puoi utilizzare:

ORDER BY CASE WHEN city = 'New York' THEN 1 ELSE 2 END, city

1
Grazie! Mi ha aiutato in MsSQL
Rexxo

Funziona effettivamente in qualsiasi database SQL (ed è una soluzione molto più pulita della risposta accettata secondo me)
a_horse_with_no_name

2
Funziona per me in Oracle.
MonkeyWithDarts

1
E per quello di cui avevo bisogno per posizionare "New York" (o un altro valore) per ultimo, scambia semplicemente 1 e 2 ... ORDER BY CASE WHEN city = 'New York' THEN 2 ELSE 1 END, city
deebs

4
La ELSE 2sezione significa che mentre New York ottiene il valore 1, tutti gli altri valori ottengono il valore 2. ... almeno per quanto riguarda l'ordinamento.
Rob Farley

106

Se il tuo dialetto SQL è abbastanza intelligente da trattare le espressioni booleane come aventi un valore numerico, puoi usare:

SELECT *
FROM `Users`
ORDER BY (`city` = 'New York') DESC, `city`

1
@MehrdadAfshari: No, MSSQL è troppo stupido per elaborare i test di equivalenza nella ORDER BYclausola.
caos

@a_horse_with_no_name: Hai provato a eseguire la query precedente su MSSQL?
caos

11
@chaos: l'istruzione di cui sopra in effetti non viene eseguita con SQL Server, ma è perché la sintassi non è standard e funziona solo per MySQL. Quando si utilizza CASEun'istruzione (che è SQL standard), SQL Server può utilizzare benissimo un'espressione nella ORDER BYclausola. " troppo stupido per elaborare test di equivalenza " è semplicemente sbagliato. true1
Semmai

@ Esraa_92: Allora non hai un dialetto SQL in grado di gestirlo e hai bisogno della risposta di Rob Farley.
caos

5
Per Postgres, questo ha funzionato per me:ORDER BY id = 123 DESC, name ASC
user1032752

4

La mia risposta potrebbe essere vecchia e non richiesta, ma qualcuno potrebbe aver bisogno di un approccio diverso, quindi pubblicandola qui.

Avevo lo stesso requisito implementato, ha funzionato per me.

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

PS

questo è per SQL

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.