【问题标题】:SELECT MAX returns the wrong valueSELECT MAX 返回错误的值
【发布时间】:2012-02-22 16:06:59
【问题描述】:

我有一个 SQL 数据库,其中有一个名为 premisis 的表。我希望选择premisisnumber 最高的行。

这是我正在使用的 SQL:

SELECT max(premisisnr) AS premisisnr FROM premisis

问题是,SQL Server 返回了错误的值!在我的表中,我有一行 premisisnumber 10,但使用上面的 SQL 语句返回 premisisnumber 9 的行。

为什么?另外,我该如何解决这个问题?

【问题讨论】:

  • 请显示您的表格数据。 MAX() 确实返回最大值。您是否有未发布的 WHERE 子句?
  • 该列声明为什么类型?
  • 您的列的数据类型是CHAR。将其更改为数字类型(整数)。
  • 尝试SELECT MAX(CAST(premisisnr AS INT))..... 之类的方法,我相信SQL Server 找到最大数值并返回!但是如果你一个数字,那么把它存储为一个数字! (不要把它放在charvarchar 列中,并期望SQL Server 知道它确实是一个数字......)
  • @marc_s:2001 年过去了 11 年,我们仍然没有 HAL 可以为我们做这些事情:(

标签: sql-server


【解决方案1】:

听起来 premisisnr 不是数字值,而是 char 或 varchar 值。发生的事情是 SQL Server 是基于字符串而不是数值进行排序的。所以 10 在 9 之前,因为 1 作为字符出现在 9 作为字符之前。

理想的解决方案是将 premisisnr 字段更改为 int 或数值。如果这不是一个选项,您可以执行以下操作:

如果 premisisnr 是整数值:

select max(cast(premisisnr as int)) as premisisnr from premisis

如果 premisisnr 是十进制值,则必须将其转换为小数以达到所需的精度和比例。

【讨论】:

  • +1 我要补充一点,如果无法更改列数据类型,则可以谨慎地提及 where 子句(ISNUMERIC() 对特定数字类型不可靠),它可以清除进入该列的垃圾,以免导致错误,或者首先可以防止垃圾的检查约束。
  • 非常有效的积分。我的经验是,有时无法更改列的原因是因为某些应用程序将数据绑定到它作为它的数据类型。所以可能没有任何字符垃圾,但其他约束有时会从应用层发挥作用。
  • 当然可以,但是应用程序无法阻止所有可能发生的临时废话。我从不相信距离数据只有一层的约束(我也不会分发允许用户禁用约束/触发器等的权限:-))。
  • 感谢您的帮助!我将 varchar 更改为 int,现在它可以正常工作了。
  • 这个解决方案解决了这个问题。感谢分享。
【解决方案2】:

您似乎有一个字符数据类型(char、nchar、varchar 等)。

要正确获取数字字段的最大值,您必须使用数字字段,例如诠释

将数据类型更改为 int,MAX() 将起作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-16
    • 2012-07-27
    • 2014-12-22
    • 1970-01-01
    • 1970-01-01
    • 2021-01-01
    • 1970-01-01
    相关资源
    最近更新 更多