帮助T-SQL特殊的排序规则

问题描述:

我有一个字段,如:帮助T-SQL特殊的排序规则

SELECT * FROM 
(
    SELECT 'A9t' AS sortField UNION ALL 
    SELECT 'A10t' UNION ALL 
    SELECT 'A11t' UNION ALL 
    SELECT 'AB9F' UNION ALL 
    SELECT 'AB10t' UNION ALL   
    SELECT 'AB11t' 
) t ORDER BY sortField 

,其结果是:

sortField 
--------- 
A10t 
A11t 
A9t 
AB10t 
AB11t 
AB9F 

其实我需要的是字符串和数字排序规则结合起来:

sortField 
--------- 
A9t 
A10t 
A11t 
AB9F 
AB10t 
AB11t 
+1

前面总有一个字母? – CristiC 2010-09-27 09:25:55

+0

不,可能是'Abc9t' – guaike 2010-09-27 09:33:32

+1

我认为它被称为“自然秩序”。已经有相同(?)的问题[这里](http://*.com/questions/34509/natural-human-alpha-numeric-sort-in-microsoft-sql-2005)。 – pascal 2010-09-27 10:39:24

如果第一个字符始终是一个信,试试:

SELECT * FROM 
(
    SELECT 'A9t' AS sortField UNION ALL 
    SELECT 'A10t' UNION ALL 
    SELECT 'A11t' 
) t ORDER BY substring(sortField,2,len(sortField)-1) desc 

SELECT * 
FROM  ( 
      SELECT 'A9t' AS sortField UNION ALL 
      SELECT 'A10t' UNION ALL 
      SELECT 'A11t' UNION ALL 
      SELECT 'AB9F' UNION ALL 
      SELECT 'AB10t' UNION ALL   
      SELECT 'AB11t' 
     ) 
     t 
ORDER BY LEFT(sortField,PATINDEX('%[0-9]%',sortField)-1)                      , 
     CAST(substring(sortField,PATINDEX('%[0-9]%',sortField),1 + PATINDEX('%[0-9][A-Z]%',sortField) -PATINDEX('%[0-9]%',sortField)) AS INT), 
     substring(sortField,PATINDEX('%[0-9][A-Z]%',sortField) + 1,LEN(sortField)) 
+0

谢谢,在你的解决方案中字符串是相同的规则,我改了主题,请看看 – guaike 2010-09-27 09:41:51

+0

编辑处理前缀和后缀> 1个字符。 – 2010-09-27 09:53:51

我会说你已经结合了字母和数字排序。但我想你问的是,你想按降序排序字母和数字,这可能很难以一个好看的方式。以前的答案不能解决您的问题,问题是Martin Smith的解决方案不会将两个字母作为前缀的字符串,而Parkyprg也不会在您要求的字母之前对数字进行排序。

您需要做的是使用自定义命令,请参阅示例:http://www.emadibrahim.com/2007/05/25/custom-sort-order-in-a-sql-statement/,但这是一种乏味的方式。

编辑:马丁斯密斯的解决方案更新,工作得很好!

+0

呃,是的,它确实(现在!) – 2010-09-27 09:54:28

+0

是的,在我的文章中很好的修复。如果我可以投票,你会得到我的投票。 – 2010-09-27 09:58:18