【发布时间】: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 来存储数字?
我有一列 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 是字符串类型,因此它按字母顺序对它们进行排序,这是预期的行为。如果可能,您应该将列更改为数字类型。如果这不可能,您可以将值转换为这样的数字:
SELECT ... ORDER BY CAST(column_name AS DECIMAL)
但是,如果您的数据库中有很多行,这将影响您的性能。
【讨论】:
order by to_number(mycol)
如果一个值不是数字,这当然会报错。这就引出了一个问题 - 为什么不首先将其设为数字列。
【讨论】:
您希望将字段转换为数值,以便 MySQL 将使用数值比较而不是字符串比较对其进行排序。
SELECT your_column
FROM your_table
ORDER BY CAST(your_column AS DECIMAL) ASC
如果您的表中有任何负数,上述内容也适用于负数。
虽然如果该字段仅包含数字数据,您确实应该将其存储为这样,而不是作为 varchar。当您获得更多行时,在查询中进行强制转换会显着影响性能。
【讨论】:
只需在字段中添加零,无需任何转换或转换:
order by 0+yourfield ASC
【讨论】: