【问题标题】:SQL, varchar field with decimals entries = ORDER BY not sorting proprelySQL,带有小数项的 varchar 字段 = ORDER BY 未正确排序
【发布时间】:2013-11-09 09:26:26
【问题描述】:

所以我有一个带有 VARCHAR 字段的表。用于对大量小数值进行排序:

假设我的 VARCHAR 字段中有以下条目:

  • 9.99
  • 263.28
  • 9.98

假设我想使用 ORDER BY varchar DESC 显示所有条目。结果是:

  • 9.99
  • 9.98
  • 263.28

显然263.28 应该是第一个。怎么了?

【问题讨论】:

  • DESC 是降序排列。如果您希望它从低到高,请将DESC 替换为ASC 或删除DESC
  • 不,我想要 DESC,但最大的数字没有首先显示。
  • 您首先不应该将数字存储在 varchar 列中。如果您使用正确的数字类型,则排序会很好。

标签: php mysql sql math numbers


【解决方案1】:

如果您在 varchar 字段中有所有十进制值,则只需将其转换为十进制,然后应用 order by 子句。我对 mysql 数据类型和转换函数不太了解,但是在 MS SQL 中,您可以将其转换为十进制,如

ORDER BY CAST(field AS DECIMAL(18,2)) DESC

更新:

是的,在 MySQL 中也有强制转换功能:http://dev.mysql.com/doc/refman/5.0/en/cast-functions.html

【讨论】:

  • 我使用 mysql。 18,2 代表什么?
  • 18 是精度为 2 的小数长度
  • 但是如果我的小数在数据库中的长度不同怎么办?
  • 不同长度是什么意思?在 MySQL 中也有 CAST 函数。见dev.mysql.com/doc/refman/5.0/en/cast-functions.html
  • 救命答案
【解决方案2】:

如果您按 varchar 列排序,mysql 将按字母顺序排序。第一个字符“2”在“9”之前。这就是为什么你得到你看到的顺序。在 order by 子句中将 varchar 列转换为十进制,它应该可以按预期工作。

或者,您可以将“9.99”更新为“009.99”等等,这样所有行的字符数都相同。然后字母排序将匹配数字排序。我并不是建议您实际使用它作为解决方案 - 它只是向您展示数据库中的工作方式。

【讨论】:

  • 我如何用 mysql 转换小数点?以前从来没有这样做过。我数据库中的十进制数据来自自定义 php 脚本,因此我可以编辑脚本以使用具有相同字符数的小数。是否有一个 php 函数可以自动执行此操作?
  • 另一个答案中的代码应该可以正常工作。来自 Upendra Chaudhari 的链接解释了有关 cast 函数的更多信息。
猜你喜欢
  • 1970-01-01
  • 2012-01-23
  • 1970-01-01
  • 2021-04-06
  • 1970-01-01
  • 2022-01-24
  • 2018-04-12
  • 1970-01-01
相关资源
最近更新 更多