帮助T-sql特殊排序规则

时间:2010-09-27 09:22:38

标签: sql sql-server tsql sorting

我有一个类似的字段:

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

3 个答案:

答案 0 :(得分:4)

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))

答案 1 :(得分:1)

如果第一个字符始终是字母,请尝试:

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

答案 2 :(得分:0)

我会说你已经结合了alpha和数字排序。但我认为你要问的是,你想按升序对字母进行排序,并按降序对数字进行排序,这可能很难以一种漂亮的方式进行。以前的答案对你的问题不起作用,问题是Martin Smith的解决方案没有带两个字母的字符串作为前缀,Parkyprg不会在你要求的字母前对数字进行排序。

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

编辑:Martins Smith的解决方案已更新并且运行正常!