Önce belirli bir değere sahip satırları nasıl döndürürüm?


124

Sorgumun, bir sütunun önce belirli bir değeri içerdiği tablonun satırlarını döndürmesini ve ardından satırların geri kalanını alfabetik olarak döndürmesini istiyorum.

Bir masam varsa şu örnek gibi bir şey:

 - 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

Ve bu tabloyu kullanarak, sorgumun önce New York'u içeren satırları, ardından şehre göre alfabetik olarak sıralanmış diğer satırları döndürmesini istiyorum. Bu yalnızca bir sorgu kullanarak yapmak mümkün mü?


Mümkünse, kabul edilen yanıtı ikinciye değiştirmeyi düşünün, çünkü ilki yalnızca MySQL için çalışıyor, MSSQL için değil.
Magisch

Bitti. İlk sorum MySQL ile ilgiliydi, ancak etiketler bunu zaten yansıtmıyordu.
Phoexo

Teşekkür ederim. Bu sabah, yaşadığım bir soruna benzer bir şey yapma çabasıyla karşılaştım. :)
Magisch

Yanıtlar:


195

SQL Server, Oracle, DB2 ve diğer birçok veritabanı sisteminde kullanabileceğiniz şey şudur:

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

1
Teşekkürler! MsSQL'de bana yardım etti
Rexxo

Bu aslında herhangi bir SQL veritabanında çalışıyor (ve bence kabul edilen cevaptan çok daha temiz bir çözüm)
a_horse_with_no_name

2
Oracle'da benim için çalışıyor.
MonkeyWithDarts

1
Ve 'New York'u (veya başka bir değeri) en son yerleştirmek için ihtiyacım olan şey için, sadece 1 ve 2'yi değiştirin ... ÖRNEĞE GÖRE SİPARİŞ
VERİN

4
ELSE 2New York değerini 1 alırken, diğer tüm değerler kadar sıralama düzeni söz konusu olduğunda gibi en az ... değerini 2. olsun o bölüm demektir.
Rob Farley

106

SQL diyalektiniz, boole ifadelerini sayısal bir değere sahip olarak ele alacak kadar akıllıysa, şunları kullanabilirsiniz:

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

1
@MehrdadAfshari: Hayır, MSSQL ORDER BYcümlecikteki denklik testlerini işlemek için çok aptal .
kaos

@a_horse_with_no_name: Yukarıdaki sorguyu MSSQL'e karşı çalıştırmayı denediniz mi?
kaos

11
@chaos: Yukarıdaki açıklama yok gerçekten değil , SQL Server ile çalışacak, ama bu en sözdizimi standart dışı ve sadece MySQL için çalışır çünkü. Bir CASEifade (standart SQL olan) kullanırken SQL Server, ORDER BYcümlede bir ifadeyi çok iyi kullanabilir . " denklik testlerini işleyemeyecek kadar aptalca " tamamen yanlış. Okuması gerekiyorsa: " MySQL'in boolean'ı (bir) truedeğerine örtük olarak1
çevrimini desteklemiyor

@ Esraa_92: O halde bunun üstesinden gelebilecek bir SQL diyalektiniz yok ve Rob Farley'in cevabına ihtiyacınız var.
kaos

5
Postgres için bu benim için çalıştı:ORDER BY id = 123 DESC, name ASC
user1032752

4

Cevabım eski olabilir ve gerekli olmayabilir ancak birisinin farklı bir yaklaşıma ihtiyacı olabilir, bu yüzden buraya yazıyorum.

Aynı şartı uyguladım, benim için çalıştı.

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

PS

bu SQL için

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.