Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL按字符串排序奇怪的语法_Sql_Sql Server 2005 - Fatal编程技术网

SQL按字符串排序奇怪的语法

SQL按字符串排序奇怪的语法,sql,sql-server-2005,Sql,Sql Server 2005,是否有一种不那么丑陋/更具程序性的方法来解决这个问题: 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

是否有一种不那么丑陋/更具程序性的方法来解决这个问题:

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

不,这就是你必须要做的,但我使用了一种稍微不同的(更干净?)语法:

但这几乎是一样的。遗憾的是,您无法使用变量/参数进行排序,因为您可能已经发现了这一点

ORDER BY @parameter DESC 

也许MS会在未来的版本中将其放入=)

创建一个包含lessonId和sortPosition列的表。加入到那个里,按排序位置排序

尝试查找数字并将其转换为整数:

ORDER BY
    CAST(REPLACE(REPLACE(lessonID, 'lesson_', ''), 'novid_', '') AS INT),
    lessonID
在线查看它的工作情况:


请注意,此查询将无法使用索引执行排序。您可以考虑使用A和索引来提高性能。

将所有的选择堆叠到子字符串位置上的分隔字符串和顺序:

order by CharIndex( '|' + lessonID + '|', '|lesson_1|lesson_novid_1|...|' )
就个人而言,我更喜欢WW使用查找表的答案

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