【问题标题】:SQL Sort by Alphanumerical OrderSQL 按字母数字顺序排序
【发布时间】:2015-10-29 14:28:17
【问题描述】:

所以我在这里查看了一些不同的示例,但它们似乎都不适合我。

这是我需要排序的示例:

Alpha #1
Beta #3
Charlie #2
Alpha #2
Charlie #1
Beta #2
Beta #1
Alpha #10

排序后我想要

Alpha #1
Alpha #2
Alpha #10
Beta #1
Beta #2
Beta #3
Charlie #1
Charlie #2

但是,当我使用以下查询时,Alpha #10 不遵循所需的规则。

ORDER BY 
Case When IsNumeric(LEFT(MachineName,1)) = 1 
     Then CASE When IsNumeric(MachineName) = 1 
               Then Right(Replicate('0',20) + MachineName + '0', 20)
               Else Right(Replicate('0',20) + MachineName, 20) 
          END
     When IsNumeric(LEFT(MachineName,1)) = 0 
     Then Left(MachineName + Replicate('',21), 20)
End

我得到了这个:

Alpha #1
Alpha #10
Alpha #2
...

我是 LEFTRIGHT 的新手,所以我可能做错了什么,因此非常感谢任何指导!

【问题讨论】:

    标签: sql sql-server alphanumeric


    【解决方案1】:
    DECLARE @t TABLE(v VARCHAR(100))
    
    INSERT INTO @t VALUES
    ('Alpha #1'),
    ('Beta #3'),
    ('Charlie #2'),
    ('Alpha #2'),
    ('Charlie #1'),
    ('Beta #2'),
    ('Beta #1'),
    ('Alpha #10'),
    ('Alpha #')
    
    SELECT * FROM @t
    ORDER BY CASE WHEN PATINDEX('%[0-9]%', v) > 1 THEN SUBSTRING(v, 1, PATINDEX('%[0-9]%', v) - 1) END, 
             CASE WHEN PATINDEX('%[0-9]%', v) > 1 THEN CAST(SUBSTRING(v, PATINDEX('%[0-9]%', v), LEN(v)) AS INT) END
    

    输出:

    Alpha #
    Alpha #1
    Alpha #2
    Alpha #10
    Beta #1
    Beta #2
    Beta #3
    Charlie #1
    Charlie #2
    

    【讨论】:

    • 是的,我相信这就是答案,但是如果我有一排没有数字怎么办?例如,Delta 我收到错误:Invalid length parameter passed to the LEFT or SUBSTRING function. 我认为这是因为某些条目中没有数字
    • 谢谢!这是完美的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-03
    • 1970-01-01
    • 1970-01-01
    • 2012-11-08
    • 1970-01-01
    • 2019-12-24
    相关资源
    最近更新 更多