2012-04-20 40 views
6

Chúng tôi đang truy vấn cơ sở dữ liệu để lấy dữ liệu trong sau thời trangTuỳ chỉnh trong SQL

chọn a, b, ... f từ table1 nơi id trong (6,33,1,78,2)

Kết quả tôi nhận được từ truy vấn theo thứ tự sau 1,2,6,33,78.

Tôi muốn kết quả theo cùng thứ tự (6,33,1,78,2). Có cách nào để lấy dữ liệu theo cùng một thứ tự không.

EDIT * Tôi đang sử dụng SQL 2008 *

+0

động cơ DB gì đang yuo sử dụng? –

+1

Đã xóa thẻ C# (không có liên quan). @Ram: Tôi cho rằng bạn không muốn giải pháp trong C# cho việc này. –

Trả lời

9

thêm lệnh này quy định tại khoản

order by case 
     when id = 6 then 1 
     when id = 33 then 2 
     when id = 1 then 3 
     when id = 78 then 4 
     when id = 2 then 5 
     end 

Nếu sử dụng MySQL bạn có thể làm

ORDER BY FIND_IN_SET(id, '6,33,1,78,2') 
+0

phải là 'khi id = 6 rồi 1' ... –

+0

Cảm ơn vì điều đó. Sửa chữa nó. –

1

giải pháp xấu xí này:

select a,b,...f from table1 where id in 6 
UNION 
select a,b,...f from table1 where id in 33 
and so on.. 

"tốt hơn" giải pháp: thêm cột khác trên truy vấn của bạn và làm trường hợp 6 0, trường hợp 33 sau đó 1 và vân vân

select a,b,...f , case id when 6 then 0 when 33 then 1 <and so on> end 
from table1 where ... 

và sau đó theo thứ tự theo cột mới này

2

tôi không biết nền, nhưng thường tôi đạt được thứ tự tùy chỉnh này trong cột orderIndex bổ sung. Bằng cách này, tôi có thể quản lý đơn hàng theo cách thủ công khi chèn vào bảng và thêm cột này vào mệnh đề ORDER BY của các truy vấn mặc định

+0

Lưu ý: điều này có thể được lập chỉ mục để hiệu suất không phải là vấn đề như trong trường hợp trong một giải pháp CASE-ing khó quản lý. – Robesz

2

Nếu bạn sử dụng SQL Server, bạn có thể sử dụng charindex.

select A, B 
from Table1 
where ID in (6,33,1,78,2) 
order by charindex(','+cast(ID as varchar(10))+',', ',6,33,1,78,2,') 
3

Sử dụng một Table Value Constructor:

SELECT a, b, ... f 
FROM 
     table1 
    JOIN 
     (VALUES 
      (1, 6), 
      (2, 33), 
      (3, 1), 
      (4, 78), 
      (5, 2) 
     ) AS ordering (position, id) 
     ON ordering.id = table1.id 
ORDER BY position