繁体   English   中英

MAX(列名称)不返回精确的最大值

[英]MAX(Column name) doesn't return exact maximum value

我有一个列idcode的表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 ,那么最好删除前缀并简单地存储整数。
  • 如果您有其他前缀,则具有用于存储字符串和整数部分的单独列。
  • 用零填充代码的数字部分; 即。 AF0045并保持字符串。 您将无法在字符串上使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM