是否有一种不那么丑陋/程序化的方法来解决这个问题:
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
答案 0 :(得分:5)
尝试找到数字并将其转换为整数:
ORDER BY
CAST(REPLACE(REPLACE(lessonID, 'lesson_', ''), 'novid_', '') AS INT),
lessonID
查看在线工作:sqlfiddle
请注意,此查询将无法使用索引执行排序。您可以考虑使用computed column并对其进行索引以提高性能。
答案 1 :(得分:2)
创建一个包含lessonId和sortPosition列的表。加入并按sortPosition订购。
答案 2 :(得分:0)
nope,这几乎是你必须要做的,但我使用了一种稍微不同(更干净?)的语法:
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会将其放在未来的版本中=)
答案 3 :(得分:0)
将所有选项堆叠成分隔字符串并在子字符串位置上排序:
order by CharIndex( '|' + lessonID + '|', '|lesson_1|lesson_novid_1|...|' )
就个人而言,我更喜欢使用查找表来回答WW的答案。