[英]MAX(Column name) doesn't return exact maximum value
我有一个列id
和code
的表test
。 它看起来像这样:
id code
1 AF1
2 AF5
3 AF6
4 AF9
5 AF45
为了获得最大的代码值,我正在尝试使用如下的sql指令:
SELECT MAX(code) from test
但是,它不会返回所需的结果。 它返回AF9
作为最大值。
现在,我的问题是:
AF
是否导致问题? AR9
是最大值。 比较是字符串。
如果要将字符串的一部分作为数字进行比较,则需要转换它们。
一种方法是使用substring()
和cast()
:
order by substring(code, 1, 2),
cast(substring(3, 10) as int)
或者,如果没有填充数字,则使用字符串长度有一个技巧:
order by length(code), code
注意:字符串长度和子字符串操作的函数因数据库而异,因此确切的函数可能会有所不同,具体取决于您使用的系统。
MySQL中没有自然排序顺序。 在狡猾的查询之外,有几种方法可以解决这个问题。 (当索引不用于排序顺序时,狡猾的查询会变得昂贵。)
AF
,那么最好删除前缀并简单地存储整数。 MAX()
,但您可以始终按ORDER BY code DESC LIMIT 1
。 这显然性能更昂贵,但仍然可能比使用子串等便宜。 如果您只想删除AF
前缀 ,可以执行UPDATE test SET code = replace(code, 'AF', '')
然后将列转换为整数。 如果您只是使用当前代码格式将列转换为整数,则它将满零并且您当前的数据将丢失。
如果代码是45AF
,那么它将变为“45”,但由于非数字部分的原因, AF45
为整数返回0。 如果您的MySQL设置为严格,则会收到有关截断数据的错误。 因此,在列转换之前进行清理是一种很好的做法。
如果你需要单独存储多个前缀 ,那么在Gordon的答案中使用子串和cast方法使用UPDATE
... SELECT
,就像这样(在创建额外的列之后):
UPDATE test SET
code_prefix = SUBSTRING(code, 1, 2),
code_number = CAST(SUBSTRING(code, 3, 10) AS INT);
这将根据您的源代码格式规范化您的结构,将原始代码的部分存储在单独的字符串和整数列中 - 您可以在整数上使用MAX(code_number)
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.