varchar 列的最大值

ash*_*ish 3 mysql aggregate

我有一个表,其中一个名为price的列键入为varchar. 我想要这个列的最大值。我正在使用这个查询:

SELECT MAX(price) FROM product_management.`item_list` 
Run Code Online (Sandbox Code Playgroud)

但结果是错误的。请解决这个问题。

我正在使用 [SB] SQLyog Ultimate Ver。9.0.2.0。

ype*_*eᵀᴹ 6

我有一个表,其中一个名为 price 的列键入为varchar.

这就是问题所在。您有一列显然具有数值(假设名称price相关)并且您选择了一种字符类型。


我想要这个列的最大值。我正在使用这个查询:

SELECT MAX(price) FROM product_management.`item_list` ;
Run Code Online (Sandbox Code Playgroud)

但结果是错误的。

结果是 100% 正确,但不是您所期望的。数据库完全按照您的要求执行 - 但不是您提出的要求。

你问了MAX()一个varchar专栏,这就是你得到的。问题在于,对于 char 列,排序是按字典顺序完成的- 就像在字典中一样 - 而不是数字顺序。因为 char 类型的列具有 char 值(字符串)而不是数字。

因此,对于数据库,它们只是字符串。你可以peters-sellers在那里很有价值。char 列的值的顺序是 - 即使所有值都是视觉上的“数字”。

1
11
165
17
2
20
200
21
21789
3
35
350
9
99
997
Run Code Online (Sandbox Code Playgroud)

当然,您的查询将返回词典最大值 ( 997) 而不是数字最大值 ( 21789)。


最好的解决方案是将列转换为数字类型 - integer, decimal,取决于您希望拥有的值 - 然后MAX()andMIN()ORDER BY将按您的预期工作。

如果您无法更改类型(通过在应用 MAX/MIN 函数之前将值转换为数字类型),则有一些解决方法,但我不建议这样做。这仍然允许在列中存储无意义的数据并可能得到转换错误(应该'peter-sellers'转换为哪个数字?)

  • 为避免错误,您可以使用类似“ORDER BY CASE WHEN price REGEXP '^[[:digit:]]+$' THEN price ELSE 0 END”之类的东西来防止非数字值。但是正如您所说,出于这个原因和其他原因,修复数据类型是迄今为止最好的解决方案。如果尚未发生这样的计算值排序,则几乎肯定会强制进行“文件排序”,因此对于大数据而言,它不会有效。 (2认同)