【问题标题】:MySQL order STRING as INT and insertingMySQL命令STRING为INT并插入
【发布时间】:2011-11-19 04:51:25
【问题描述】:

我有一个这样的数据集:

print_id
--------
2b
1
2
4b
4a
3
6
2a
5

打印 ID 的格式可以是:/([0-9]+)([a-e]{1})?/

我想要的是先按数字订购它们,如果有的话再按字母订购。如果没有字母,则它是该数字顺序中的第一个。所以结果应该是这样的:

print_id
--------
1
2
2a
2b
3
4a
4b
5
6

我尝试了 ORDER BY (print_id + 0),它正确地对数字进行了排序,但它并没有完全做到这一点。有什么建议吗?

【问题讨论】:

    标签: mysql sql sql-order-by natural-sort


    【解决方案1】:

    ORDER BY 子句中可以有多个表达式:

    ORDER BY print_id + 0, print_id
    

    这将首先尝试按数字对它们进行排序(丢弃字母后缀),如果它们在数字上相等,它将按它们的字符串值(包括字母后缀)对它们进行排序。对于您描述的规则,唯一会破坏的情况是您有前导零;例如,这个ORDER BY 子句将'01b' 排序在'1a' 之上。这会发生在您的数据中吗?

    【讨论】:

    • 不,我的数据中不会出现前导零。因此,您的解决方案是完美的。非常感谢。
    • @Andreas:问题指定了 MySQL。
    【解决方案2】:
    ORDER BY print_id
    

    应该做你想做的。它将按字符域print_id排序,相当于按单个字符排序。

    所以,对于一张桌子

    print_id
    --------
    1
    3a
    3c
    2b
    2c
    2a
    3b
    0
    0b
    00
    

    你会得到

    print_id
    --------
    0
    00
    0b
    1
    2a
    2b
    2c
    3a
    3b
    3c
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-26
      • 1970-01-01
      • 2013-04-01
      • 1970-01-01
      • 2011-08-07
      • 2011-04-12
      • 1970-01-01
      相关资源
      最近更新 更多