2011-01-25 9 views
19

Có thể xác định thứ tự sắp xếp cho các kết quả trả về không?TSQL - Có thể xác định thứ tự sắp xếp không?

Tôi muốn thứ tự sắp xếp là 'cam' 'táo' 'dâu tây' không tăng dần hoặc giảm dần.

Tôi biết ORDER BY có thể thực hiện ASC hoặc DESC nhưng có một loại được định nghĩa ('cam', 'táo', 'dâu tây') không?

này sẽ được chạy trên SQL Server 2000.

Trả lời

44

Đó là cực kỳ phiền phức, nhưng bạn có thể sử dụng tuyên bố CASE cho đặt hàng:

SELECT * FROM Blah 
ORDER BY CASE MyColumn 
    WHEN 'orange' THEN 1 
    WHEN 'apple' THEN 2 
    WHEN 'strawberry' THEN 3 
    END 

Cách khác, bạn có thể tạo một bảng phụ có chứa trường sắp xếp và thứ tự sắp xếp.

TargetValue SortOrder 
orange  1 
apple  2 
strawberry 3 

Và tham gia bảng của bạn trên bảng mới này.

+14

Hah! Giống như tôi sẽ tin tưởng bất kỳ SQL đến từ một ai đó gọi là LittleBobbyTables :-) – paxdiablo

+2

@pax - :-) – LittleBobbyTables

+0

+1 cho tùy chọn bảng, luôn linh hoạt hơn – RichardTheKiwi

9

Sử dụng một CASE statement:

ORDER BY CASE your_col 
      WHEN 'orange' THEN 1 
      WHEN 'apple' THEN 2 
      WHEN 'strawberry' THEN 3 
     END 

cú pháp thay thế, với một ELSE:

ORDER BY CASE 
      WHEN your_col = 'orange' THEN 1 
      WHEN your_col = 'apple' THEN 2 
      WHEN your_col = 'strawberry' THEN 3 
      ELSE 4 
     END 
+0

Nếu tôi muốn một số mục nhất định xuất hiện ở cuối kết quả SELECT thì sao? – user1451111

2

Những gì tôi làm trong trường hợp đó là

ORDER BY 
    CASE WHEN FRUIT = 'Orange' THEN 'A' 
     WHEN FRUIT = 'Apple' THEN 'B' 
     WHEN FRUIT = 'Strawberry' THEN 'C' 
     ELSE FRUIT 
END 
+0

Nếu tôi muốn một số mặt hàng xuất hiện ở cuối kết quả SELECT thì sao? – user1451111

5

Nếu đây sẽ là một yêu cầu trong thời gian ngắn, sử dụng một tuyên bố như vậy. Tuy nhiên, nếu bạn nghĩ rằng nó có thể được khoảng một thời gian, và nó sẽ luôn luôn được orange/apple/strawberry thứ tự (hoặc thậm chí nếu không - xem dưới đây), bạn có thể muốn suy nghĩ về hy sinh một số không gian đĩa để đạt được một số tốc độ.

Tạo cột mới trong bảng của bạn được gọi là or_ap_st và sử dụng trình kích hoạt chèn/cập nhật để điền vào số 1, 2 hoặc 3, tùy thuộc vào giá trị của cột trái cây của bạn. Sau đó, chỉ mục trên đó.

Vì thời gian duy nhất dữ liệu trong cột đó sẽ thay đổi là khi hàng thay đổi, đó là thời điểm tốt nhất để thực hiện. Chi phí sau đó sẽ được phát sinh trên một số lượng nhỏ các bài viết thay vì một số lượng lớn các lần đọc, do đó được phân bổ theo các tuyên bố select.

truy vấn của bạn sau đó sẽ là một blindingly nhanh:

select field1, field2 from table1 
order by or_ap_st; 

không có chức năng cho mỗi hàng giết hiệu suất.

Và, nếu bạn muốn có các đơn hàng sắp xếp khác, tốt, đó là lý do tôi gọi cột or_ap_st. Bạn có thể thêm bao nhiêu cột sắp xếp khác nếu cần.

1

Đi xa turtlepick's answer:

ORDER BY 
    CASE WHEN FRUIT = 'Orange' THEN 'A' 
     WHEN FRUIT = 'Apple' THEN 'B' 
     WHEN FRUIT = 'Strawberry' THEN 'C' 
     ELSE FRUIT 
    END 

Trong trường hợp bạn có một số mặt hàng hơn trong trái cây và chúng xảy ra để bắt đầu với chữ xác định sau khi THEN từ khóa, những mặt hàng sẽ xuất hiện trong trình tự mã hóa cứng. Ví dụ chuối xuất hiện trước Strawberry.Bạn có thể phá vỡ nó với

ORDER BY 
    CASE 
    WHEN FRUIT = 'Orange' THEN '.1' 
    WHEN FRUIT = 'Apple' THEN '.2' 
    WHEN FRUIT = 'Strawberry' THEN '.3' 
    ELSE FRUIT 
    END 

Ở đây tôi đã sử dụng các ký tự có giá trị ASCII thấp hơn với hy vọng chúng sẽ không xuất hiện ở đầu giá trị trong FRUIT.

0

Thêm một chìa khóa để bàn (ví dụ fruit_id int sắc (1,1) primary key) để giữ gìn trật tự của chèn

create table fruit(fruit_id int identity(1,1) primary key, name varchar(50)) 
go 

insert into fruit(name) values ('orange') 
insert into fruit(name) values ('apple') 
insert into fruit(name) values ('strawberry') 

select name from fruit 

kết quả:

orange 
apple 
strawberry 
0

Không như thông thường, nhưng đối với các hoạt động giá trị đơn lẻ hoặc các mẫu cụ thể, THAY THẾ cũng hoạt động quá

ví dụ:

DECLARE @Fruit TABLE (Fruit_Id INT IDENTITY(1, 1) PRIMARY KEY ,Name VARCHAR(50)); 

INSERT INTO @Fruit (Name) VALUES ('Orange'); 
INSERT INTO @Fruit (Name) VALUES ('Apple'); 
INSERT INTO @Fruit (Name) VALUES ('Strawberry'); 
INSERT INTO @Fruit (Name) VALUES ('__Pear'); 


SELECT * FROM @Fruit AS f 
ORDER BY REPLACE(f.Name,'__','') 



Fruit_Id Name 
----------- -------------------------------------------------- 
2   Apple 
1   Orange 
4   __Pear 
3   Strawberry