2011-12-06 162 views
1

問題: 在MY_TABLE一行包含SQL重排排順序

1 
2 
3 
3 
4 
4 
4 

我要重新排列的行順序以下

4 
4 
4  
1 
3 
3 
2 

有什麼辦法,我可以執行嗎?

到目前爲止我還沒有寫任何代碼。 (我不知道如何開始)

回答

2

只需在ORDER BY中使用CASE - 它更清晰易讀。

... 
ORDER BY CASE WHEN YourColumn = 4 then 0 
       WHEN YourColumn = 2 then 1 
       ELSE 2 END, yourcolumn 

這也是一個壞主意改變行的順序,因爲實際上存在SQL沒有內在的秩序 - 這一切都在表示層,所以用在你的SELECT小號ORDER BY來完成它。

0
SELECT yourColumn 
FROM 
(
    SELECT yourColumn 
     , CASE yourColumn 
      WHEN 4 THEN 1 
      WHEN 1 THEN 2 
      WHEN 3 THEN 3 
      WHEN 2 THEN 4 
     END AS SortColumn 
    FROM yourTable 
) AS t 
ORDER BY t.SortColumn ASC 

這將排序4,1,3,2

+0

尼斯。但是,你是否也需要陷入2(在CASE中)呢? – Aaron

+0

它給了我以下錯誤:消息4145,級別15,狀態1,行7 在'THEN'附近預期條件的上下文中指定的非布爾類型表達式。 – Ish

+1

排序asc不會去,因爲你看到2是最後一個desc從3。 – Maess

2

亞當溫格說,

,或者如果你願意,它可以在完成你的表,這意味着你的SQL語句可以繼續作爲一個基本的SELECT * FROM表ORDER BY newcolumn *

見下面

add a new column 
update each row set column=1 where original_column=4 
update each row set column=2 where original_column=2 
update each row set column=3 where original_column=1 
update each row set column=4 where original_column=3 

,然後按這個新列排序。

0

與原始值和相應的排序順序創建一個查找表:

SortLookupTable: 
OriginalValue, SortOrder 
1,    2 
2,    4 
3,    3 
4,    1 

然後將表與原來的表

SELECT T.* 
FROM 
    MyTable T 
    INNER JOIN SortLookupTable S 
     ON T.Value = S.OriginalValue 
ORDER BY 
    S.SortOrder;