2011-12-15 27 views
5

Tôi có một ý tưởng, ví dụ: Tôi có một bảng chứa tên (Ann, Ben, Chris, Tom, John),
Tôi muốn truy vấn nó bằng cách sử dụng sql từ chữ cái đầu tiên, z cuối cùng.Sử dụng SQL để truy vấn theo thứ tự ngoại trừ hồ sơ đầu tiên

Nhưng tôi có một điều kiện là tôi muốn đưa John vào hồ sơ đầu tiên.

+1

Tôi đồng ý với bluefeet. Ngoài ra, nếu mọi người không trả lời câu hỏi của bạn, hãy tự trả lời. – Chris

+0

có thể trùng lặp [sắp xếp theo giá trị cụ thể - ORDER BY] (http://stackoverflow.com/questions/4138430/sorting-by-value-specific-order-by) – GSerg

Trả lời

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

+1 không cần sử dụng 'UNION' –

+0

Trường hợp có nhanh hơn nơi + công đoàn không? Tôi sẽ nghĩ với một chỉ số phong nha nơi + công đoàn có thể nhanh hơn. – Chris

+2

@aF, tránh UNION không phải là một mục tiêu trong và của chính nó, đặc biệt nếu bạn có thể sử dụng 'UNION ALL', ngăn cản việc kiểm tra tốn kém cho các bản sao. – Johan

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

Hoặc tổng quát hơn:

(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) 

Nếu bạn để tránh sự kết hợp đối với một số lý do, mã chậm này cũng sẽ làm việc:

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 

Trong SQL-server cú pháp hơi khác, truy vấn phụ là:

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

tên người dùng IS NULL? ;-) – wildplasser

+0

Bạn không cần truy vấn bên ngoài ở đây để 'CHỌN' kết quả của' UNION'? – Yuck

+1

Do thiếu 'thứ tự bên ngoài', máy chủ vẫn được phép trộn các hàng từ hai công đoàn. – GSerg

1

Nó rất đơn giản:

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

Do thiếu 'thứ tự bên ngoài', máy chủ vẫn được phép trộn các hàng từ hai công đoàn. – GSerg

+2

Thay đổi UNION thành UNION ALL, bạn đang hợp nhất hai bộ loại trừ lẫn nhau. – Johan

+0

Bạn sẽ chọn người dùng 'john' hai lần. – Johan

0

Đặt một tuyên bố trường hợp theo trình tự quy định tại khoản không hoạt động với lựa chọn khác nhau. Tôi tìm thấy những điều sau đây trực quan hơn và hoạt động nếu bạn cũng cần chọn riêng biệt. Mặc dù nó trả về một cột bổ sung trong tập kết quả.

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 

Kết quả:

Name IsTopRow 
John 1 
Ann  0 
Ben  0 
Chris 0 
Tom  0 
Các vấn đề liên quan