3

これを解決するための見苦しくない/よりプログラム的な方法はありますか:

ORDER BY CASE 
 WHEN lessonID = 'lesson_1' Then 1  
 WHEN lessonID = 'lesson_novid_1' Then 2 
 WHEN lessonID = 'lesson_2' Then 3 
 WHEN lessonID = 'lesson_novid_2' Then 4 
 WHEN lessonID = 'lesson_3' Then 5 
 WHEN lessonID = 'lesson_novid_3' Then 6 
 WHEN lessonID = 'lesson_4' Then 7 
 WHEN lessonID = 'lesson_novid_4' Then 8 
 WHEN lessonID = 'lesson_5' Then 9 
 WHEN lessonID = 'lesson_novid_5' Then 10 
 WHEN lessonID = 'lesson_6' Then 11 
 WHEN lessonID = 'lesson_novid_6' Then 12
 WHEN lessonID = 'lesson_7' Then 13 
 WHEN lessonID = 'lesson_novid_7' Then 14
 WHEN lessonID = 'lesson_8' Then 15
 WHEN lessonID = 'lesson_novid_8' Then 16
 WHEN lessonID = 'lesson_9' Then 17
 WHEN lessonID = 'lesson_novid_9' Then 18
 WHEN lessonID = 'lesson_10' Then 19
 WHEN lessonID = 'lesson_novid_10' Then 20
 WHEN lessonID = 'lesson_11' Then 21
 WHEN lessonID = 'lesson_novid_11' Then 22 
 WHEN lessonID = 'lesson_12' Then 23 
 WHEN lessonID = 'lesson_novid_12' Then 24
End ASC
4

4 に答える 4

5

数値を見つけて整数にキャストしてみてください。

ORDER BY
    CAST(REPLACE(REPLACE(lessonID, 'lesson_', ''), 'novid_', '') AS INT),
    lessonID

オンラインで動作することを確認してください: sqlfiddle

このクエリでは、インデックスを使用して順序付けを実行できないことに注意してください。パフォーマンスを向上させるために、計算列を使用してインデックスを作成することを検討できます。

于 2012-08-06T21:33:50.033 に答える
2

lessonId と sortPosition の列を持つテーブルを作成します。それに参加し、sortPosition で並べ替えます。

于 2012-08-06T21:33:43.393 に答える
0

すべての選択肢を区切り文字列に積み上げ、部分文字列の位置で並べ替えます。

order by CharIndex( '|' + lessonID + '|', '|lesson_1|lesson_novid_1|...|' )

個人的には、ルックアップテーブルを使用したWWの回答が好きです。

于 2012-08-06T22:03:16.920 に答える
0

いいえ、それはあなたがしなければならないこととほとんど同じですが、私は少し異なる(よりクリーンな?)構文を使用しました:

ORDER BY (CASE lessonID
 WHEN 'lesson_1' Then 1   
 WHEN 'lesson_novid_1' Then 2  
 WHEN 'lesson_2' Then 3  
 End) ASC 

しかし、それはほとんど同じことです。悲しいことに、おそらくあなたが知っているように、変数/パラメータを使用してソートすることはできません

ORDER BY @parameter DESC 

多分MSはそれを将来のリリースで置くでしょう=)

于 2012-08-06T21:29:57.737 に答える