2011-12-15 14 views
5

dışında sorgulamak için SQL'i kullanın. Adı (Ann, Ben, Chris, Tom, John),
içeren bir tablom var. Bunu sql kullanarak bir ilk, z harfini kullanarak sorgulamak istiyorum.İlk kayıt

Ama John’a ilk kayıtta yer vermek istediğim bir durum var.

+1

Ben bluefeet katılıyorum. Ayrıca, eğer insanlar sorularınızı cevaplamazsa, kendinize cevap verin. – Chris

+0

olası [kopyalamaya göre belirli bir değerle sıralama - ORDER BY] (http://stackoverflow.com/questions/4138430/sorting-by-value-specific-order-by) – GSerg

cevap

19
select name 
from names 
order by 
    case when name = 'John' then 0 else 1 end, 
    name 
+1

+1 durum bu durumda + sendikadan daha mı hızlı? İyi bir endeks ile + birliğin daha hızlı olabileceğini düşünürdüm. –

+0

'ı kullanmanıza gerek kalmadan – Chris

+2

@aF, UNION'lerden kaçınmak, kendi başına bir amaç değildir, özellikle de 'UNION ALL' özelliğini kullanabiliyorsanız, bu da çiftlerin masraflı bir şekilde kontrol edilmesini önler. – Johan

2
(SELECT * FROM atable WHERE username = 'John') 
UNION ALL 
    (SELECT * FROM atable WHERE username <> 'John' ORDER BY username) 

Veya daha genel: Herhangi bir nedenden dolayı birliği engellemek için sahip varsa

(SELECT * FROM atable ORDER BY username DESC LIMIT 1) 
UNION ALL 
    (SELECT * FROM atable WHERE id NOT IN (
    SELECT id FROM atable ORDER BY username DESC LIMIT 1) 
    ORDER BY username) 

, bu daha yavaş kodu da çalışacaktır:

SELECT * FROM atable 
ORDER BY 
    CASE WHEN id IN (SELECT id FROM atable ORDER BY username DESC LIMIT 1) 
    THEN 0 ELSE 1 END 
    , username 

SQL sunucusunda sözdizimi biraz farklıdır, alt sorgu şu şekildedir:

SELECT TOP 1 id FROM atable ORDER BY username DESC 
+0

kullanıcı adı IS NULL? ;-) – wildplasser

+0

Buraya 'UNION'un sonuçları SELECT' için bir dış sorguya ihtiyacınız yok mu? – Yuck

+1

Dıştan bir 'siparişe göre' eksik olduğu düşünüldüğünde, sunucunun hala iki sendikadan satırları karıştırmasına izin verilir. – GSerg

1

Bu basit:

(SELECT Name 
FROM Users 
WHERE Name = 'John') 
UNION ALL 
(SELECT * 
FROM Users 
WHERE Name <> 'John' 
ORDER BY Name) 
+2

Dıştan bir 'emir' eksikliğinden dolayı, sunucu hala iki sendikadan satırları karıştırmasına izin verilir. – GSerg

+2

UNION'u UNION ALL olarak değiştirin, iki ayrı özel kümeyi birleştiriyorsunuz. – Johan

+0

"john" kullanıcısını iki kez seçeceksin. – Johan

0

seçme ayrı çalışmaz maddesi ile sırayla bir olgu deyimi yerleştirmek. Aşağıdakileri daha sezgisel olarak bulabilirim ve ayrıca ayrı bir seçime ihtiyacınız varsa çalışır. Sonuç kümesinde fazladan bir sütun döndürse bile.

DECLARE @names TABLE 
(
    Name varchar(20) 
) 

INSERT INTO @names 
SELECT 'Tom' 

INSERT INTO @names 
SELECT 'John' 

INSERT INTO @names 
SELECT 'Chris' 

INSERT INTO @names 
SELECT 'Ann' 

INSERT INTO @names 
SELECT 'Ben' 

select Name, case when Name = 'John' then 1 else 0 end AS IsTopRow 
from @names 
order by IsTopRow DESC, Name 

Sonuçlar:

Name IsTopRow 
John 1 
Ann  0 
Ben  0 
Chris 0 
Tom  0 
İlgili konular