【问题标题】:How to order by letters then by numbers?如何按字母排序,然后按数字排序?
【发布时间】:2018-07-31 14:10:13
【问题描述】:

如何在 SQL-Server 中按数值排序之前按字母字符对查询结果进行排序?

我有我想要查询的带有列的 myTable

我找到了this,上面写着尝试类似:

SELECT * FROM dbo.myTable
WHERE aColumn LIKE '%val'
ORDER BY IF(aColumn RLIKE '^[a-z]', 1, 2), aColumn

但是这是针对 MySQL 的,这可能是它在 SQL-Server 中不起作用的原因。带有正则表达式过滤器的 SQL-Server 有类似的东西吗?我收到的错误消息是:

Msg 156, Level 15, State 1, Line 3
Incorrect syntax near the keyword 'IF'
Msg 102, Level 15, State 1, Line 3
Incorrect syntax near 'RLIKE'

我想看到的是这样的:

Aval
Bval
Cval
1val
2val

而不是

1val
2val
Aval
Bval
Cval

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    您可以使用LIKE 谓词:

    SELECT m.* 
    FROM dbo.myTable m
    WHERE aColumn LIKE '%val'
    ORDER BY (CASE WHEN aColumn like '[a-z]%' THEN 0 ELSE 1 END), aColumn;
    

    【讨论】:

    • 很好的答案,但是如果我删除了 m.在 * 之前的第一行和 dbo.myTable 之后的第二行中的 m,m 是怎么回事?
    • @G.LC。 . .这个查询没有问题。但是,是的,创建表的别名以了解它的来源是一个很好的做法。
    【解决方案2】:

    我猜会有一些极端情况会显示数字或您希望以其他方式进行排序。这是一个应该灵活的解决方案:

    DECLARE @TOTALS TABLE
    (
      ID INT IDENTITY,
      THEDATA VARCHAR(255)
    )
    
    INSERT INTO @TOTALS (THEDATA)
    SELECT THEDATA FROM atest 
    WHERE THEDATA NOT LIKE '%[0-9]%'
    ORDER BY THEDATA ASC
    
    INSERT INTO @TOTALS (THEDATA)
    SELECT THEDATA FROM atest 
    WHERE THEDATA LIKE '%[0-9]%'
    ORDER BY THEDATA ASC
    
    SELECT * FROM @TOTALS
    ORDER BY ID ASC
    

    您可以做一个table variable 并使用各种SELECT 语句来填充该表。由于它有一个IDENTITY 列,它可以跟踪插入的订单项目。然后只需SELECT 按该命令退出!

    在这种情况下,我只是将所有没有数字的值放入(排序)中,然后将所有有数字的值放入(排序)中。

    我希望这会有所帮助:)

    【讨论】:

    • 谢谢 直到现在才看到这个
    猜你喜欢
    • 1970-01-01
    • 2013-06-29
    • 1970-01-01
    • 1970-01-01
    • 2021-09-13
    • 2021-06-27
    • 1970-01-01
    • 1970-01-01
    • 2020-09-03
    相关资源
    最近更新 更多