【问题标题】:Help with T-sql special sorting rules帮助 T-sql 特殊排序规则
【发布时间】:2011-04-17 16:16:35
【问题描述】:

我有一个字段:

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

【问题讨论】:

  • 前面总是一个字母?
  • 我认为这叫做“自然秩序”。已经有相同的(?)问题here

标签: sql sql-server tsql sorting


【解决方案1】:
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 个字符。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    我会说你已经结合了字母和数字排序。但是我认为您要问的是您想按升序对字母进行排序,并按降序对数字进行排序,这可能很难以美观的方式进行。以前的答案不适用于您的问题,问题是 Martin Smith 的解决方案不会将带有两个字母的字符串作为前缀,并且 Parkyprg 不会按照您的要求对字母前的数字进行排序。

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

    编辑:Martins Smith 的解决方案已更新,运行良好!

    【讨论】:

    • 是的,在我的帖子中修复得很好。如果我能投票,你会得到我的投票。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-20
    • 2017-02-10
    • 1970-01-01
    • 1970-01-01
    • 2010-12-10
    相关资源
    最近更新 更多