代码之家  ›  专栏  ›  技术社区  ›  zeke

以类似Excel的方式在MySQL中排序varchar列

  •  1
  • zeke  · 技术社区  · 14 年前

    我有一个包含混合数据的varchar列-字符串、整数、小数、空字符串和空值。我想像Excel那样对列进行排序,先对数字排序,然后对字符串排序。例如:

    • 1个
    • 10个
    • 11个
    • 德意志北方银行
    • 艾伦
    • 鲍勃
    • 卡尔
    • (空白/空)
    • (空白/空)

    马丁诺夫的建议在很大程度上是有效的,如果我再进一步研究一下,我就能得到我想要的东西:

    从测试中选择 订货人 a为空或a='', a<gt;'0'和a=0, 一;

    虽然很难看,但我不确定是否有更好的选择。

    2 回复  |  直到 14 年前
        1
  •  1
  •   MartinodF    14 年前

    那是因为 my_column+0 等于所有字符串(0)。

    ORDER BY my_column+0, my_column

    mysql> SELECT a FROM test ORDER BY a+0, a;
    +-------+
    | a     |
    +-------+
    | NULL  |
    | alan  |
    | bob   |
    | carl  |
    | david |
    | 1     |
    | 2     |
    | 3     |
    | 3.5   |
    | 10    |
    | 11    |
    | 12    |
    +-------+
    12 rows in set (0.00 sec)
    

    如果你严格要求数字在字符串之上,这里有一个解决方案 :

    mysql> SELECT a FROM test ORDER BY (a = CONCAT('', 0+a)) DESC, a+0, a;
    +-------+
    | a     |
    +-------+
    | 1     |
    | 2     |
    | 3     |
    | 3.5   |
    | 10    |
    | 11    |
    | 12    |
    | alan  |
    | bob   |
    | carl  |
    | david |
    | NULL  |
    +-------+
    12 rows in set (0.00 sec)
    
        2
  •  1
  •   CoolBeans Jake    13 年前

    这是有效的:

    SELECT a FROM test ORDER BY a IS NULL OR a='', a<>'0' AND a=0, a+0, a;
    

    不过,我们欢迎任何更有效/更优雅的解决方案。