【问题标题】:Sort Number containing letters in numeric order [duplicate]按数字顺序对包含字母的数字进行排序[重复]
【发布时间】:2020-01-16 19:33:31
【问题描述】:

我有一系列包含数字但有时还包含字母的 ID。 例如:

    1,
    A1,
    B1,
    A10,
    A11,
    2,
    A2,
    A20,
    B2,
    3,
    A3,
    B3,
    4,
    A4,
    B4
    5,
    A5
    B5

我需要将它们排序如下:

    A1,
    A2,
    A3,
    A4,
    A5,
    A10,
    A11,
    A20,
    B1,
    B2,
    B3,
    B4,
    B5,
    1,
    2,
    3,
    4,
    5

最好的方法是什么?

ID 是从外部给我的,无法更改。

【问题讨论】:

  • 如果只有 1 个前导字母字符,那么这相当简单 - 如果没有,那么它不简单 - 是您的示例数据代表 - 例如,您会得到 zz1 吗?你需要的输出
  • 也许您应该重新设计您的表格并制作这两列。那么排序将是一件轻而易举的事。 (您仍然可以将连接的 ID 作为表中的计算列。)

标签: sql tsql


【解决方案1】:

问题最初被标记为 MySQL。

如果前缀只有一个字母,你可以这样做:

order by (id regexp '^[A-Z]') desc,                            -- put letters first
         (case when id regexp '^[A-Z]' then left(id, 1) end),  -- order by letter
         length(id) asc,
         id

在 SQL Server 中,您可以将其表示为:

order by (case when id like '[A-Z]%' then 1 else 2 end),
         (case when id like '[A-Z]%' then left(id, 1) end),
         length(id),
         id

【讨论】:

  • 目前只有一个前导字母。未来可能会更多,但老实说,看到情况并非如此,我可能能够说服其他相关方将其作为规则。
  • 试过了,我只是得到一个“'regexp'附近的语法不正确。”错误。
  • regexp?这是 T-SQL,你是否对不同的 rdbms 感到困惑?
  • @ZoharPeled 。 . . OP更改了标签。
  • @ZoharPeled 我的数据库搞混了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-27
  • 1970-01-01
  • 2014-05-14
  • 2013-11-02
相关资源
最近更新 更多