2010-09-08 16 views
6

Sto cercando di ottenere la seguente query per visualizzare i risultati in ordine alfabetico per città, tranne per il fatto che io voglio "Berlino" a comparire in cima alla listaSQL Server - Ordina per caso

Così il risultati sarebbero simile a

  • Berlino
  • Algeria
  • l'Australia
  • Fiji
  • Grecia
  • ...

speranza che abbia un senso,

Attualmente sono disponibili le seguenti ...

SELECT CompanyName, City 
FROM customers 
ORDER BY case when City = 'Berlin' END 

risposta

1
SELECT CompanyName, City 
FROM customers 
ORDER BY case when City = 'Berlin' then 1 else 999 END asc 
+1

Per favore perdonare la mia ignoranza ma cosa significa questo "quindi 1 altro 999" ?? – Tom

+1

I dati risultanti dal caso. Quando la sua Berlino ritorna 0 altrimenti restituisce 999 –

+0

fare questa query ha bisogno anche di clienti in ordine di clausola? Senza che ciò non dia risultati per le colonne numeriche –

15

Quasi:

SELECT CompanyName, City 
FROM customers 
ORDER BY CASE WHEN City = 'Berlin' THEN 0 ELSE 1 END, City 
+0

Suoni come questo dovrebbero funzionare, ma perché non su questa pagina di tryit SQL ?? – Tom

+0

http://www.w3schools.com/sql/sql_tryit.asp – Tom

2

provare qualcosa come

SELECT CompanyName, City 
FROM customers 
ORDER BY case when City = 'Berlin' THEN 0 ELSE 1 END, City 
7
SELECT CompanyName, City, CASE WHEN City = 'Berlin' THEN 0 ELSE 1 END AS Ordering 
FROM customers 
ORDER BY Ordering, City 
+1

+1 per la conformità SQL-92, ad esempio solo i nomi di colonna dalla clausola 'SELECT' devono essere utilizzati nella clausola' ORDER BY'. Ho scelto di chiudere un occhio sulla parola chiave 'AS' mancante, ad esempio' AS Ordering';) – onedaywhen

+0

Buona scelta. Modificata la risposta –

1

stringa come vuota appare per primo in qualsiasi lista di stringhe ordinata, tutti gli altri risultati ordinati normalmente. Quindi, questo funziona perfettamente:

SELECT CompanyName, City 
FROM customers 
ORDER BY CASE WHEN City = 'Berlin' THEN '' ELSE City END 

Testato con:

CREATE TABLE customers (CompanyName VARCHAR(50), City VARCHAR(50)) 

INSERT INTO customers VALUES ('Customer1', 'Berlin') 
INSERT INTO customers VALUES ('Customer2', 'Algeria') 
INSERT INTO customers VALUES ('Customer3', 'Australia') 
INSERT INTO customers VALUES ('Customer4', 'Fiji') 
INSERT INTO customers VALUES ('Customer5', 'Greece') 

SELECT CompanyName, City 
FROM customers 
ORDER BY CASE WHEN City = 'Berlin' THEN '' ELSE City END 

-- OUPUT 
-- Customer1 Berlin 
-- Customer2 Algeria 
-- Customer3 Australia 
-- Customer4 Fiji 
-- Customer5 Greece 
0

Come sull'utilizzo Union? Qualcosa di simile, per esempio:

SELECT 1 as Weight, CompanyName, City FROM customers 
WHERE city='Berlin' 
UNION ALL 
SELECT 2 as Weight, CompanyName, City FROM 
customers 
WHERE city<>'Berlin' 
ORDER BY Weight, City 
+2

Che non funziona; L'ORDINE DI si applica all'intero sindacato e rimarrai comunque in alto con l'Algeria. – LittleBobbyTables

+0

Grazie per l'osservazione. Ma ora con parentesi funziona correttamente. Ho usato la pagina tryit SQL per controllare –

+0

Scusa, no, è sbagliato, mio ​​errore. L'Unione ignora l'ordinamento in realtà ... –

Problemi correlati