【问题标题】:SQL query for sorting numeric fields用于对数字字段进行排序的 SQL 查询
【发布时间】:2010-07-16 15:09:16
【问题描述】:

我有一列 VARCHAR 类型的列,其中存储 数字,例如 10、11、16.5、24、43、12、100 等。

我想对这些字段进行排序,但排序如下:

10
11
12
16.5
100
24
43

我想要这样的结果:

10
11
12
16.5
24
43
100

我该怎么做?

【问题讨论】:

  • 你为什么还要使用 varchar 来存储数字?

标签: mysql sql field sorting


【解决方案1】:

VARCHAR 是字符串类型,因此它按字母顺序对它们进行排序,这是预期的行为。如果可能,您应该将列更改为数字类型。如果这不可能,您可以将值转换为这样的数字:

SELECT ... ORDER BY CAST(column_name AS DECIMAL)

但是,如果您的数据库中有很多行,这将影响您的性能。

【讨论】:

  • 当然,只有在该字段的结果集中没有非数字数据片段时它才会起作用。
【解决方案2】:
order by to_number(mycol)

如果一个值不是数字,这当然会报错。这就引出了一个问题 - 为什么不首先将其设为数字​​列。

【讨论】:

    【解决方案3】:

    您希望将字段转换为数值,以便 MySQL 将使用数值比较而不是字符串比较对其进行排序。

    SELECT your_column 
    FROM your_table 
    ORDER BY CAST(your_column AS DECIMAL) ASC
    

    如果您的表中有任何负数,上述内容也适用于负数。

    虽然如果该字段仅包含数字数据,您确实应该将其存储为这样,而不是作为 varchar。当您获得更多行时,在查询中进行强制转换会显着影响性能。

    【讨论】:

      【解决方案4】:

      只需在字段中添加零,无需任何转换或转换:

      order by 0+yourfield ASC
      

      【讨论】:

        猜你喜欢
        • 2020-01-26
        • 2019-03-30
        • 1970-01-01
        • 2021-04-13
        • 1970-01-01
        • 2020-10-22
        • 2019-01-13
        • 1970-01-01
        • 2012-09-30
        相关资源
        最近更新 更多