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

创建一个包含 courseId 和 sortPosition 列的表。加入它并按 sortPosition 排序。

于 2012-08-06T21:33:43.393 回答
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 回答
0

将所有选项堆成一个分隔字符串并按子字符串位置排序:

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

就个人而言,我更喜欢 WW 使用查找表的答案。

于 2012-08-06T22:03:16.920 回答