【问题标题】:Data type mismatch using RND()使用 RND() 的数据类型不匹配
【发布时间】:2013-07-07 01:45:03
【问题描述】:

我需要一些有关 SQL 查询的帮助。该查询旨在从表中返回 75 条随机记录。这是查询:

SELECT TOP 75 a.Number, a.Location, a.Manufacturer
FROM a
WHERE (((a.Location) = 'Columbus'))
ORDER BY Rnd(Int(Now()*Number)-Now()*Number);

如果我在 WHERE 子句中使用不同的城市名称,则此查询可以正常工作。例如,如果我将 WHERE 子句更改为 WHERE (((a.Location) = 'Toledo')),则查询有效。但是,如果城市名称是“哥伦布”,则会出现数据类型不匹配错误。

【问题讨论】:

    标签: sql ms-access random


    【解决方案1】:

    您需要验证 Number 列中的值,其中 a.Location = 'Columbus'... 我怀疑您在其中一个 Number 列中有一个非数字值,这会导致类型不匹配错误。

    您可以使用它来缩小范围:

    SELECT *
    FROM a
    WHERE NOT ISNUMERIC(a.Number) and a.Location = 'Columbus'
    

    或者更好的是,排除位置以查找任何可能的错误值:

    SELECT *
    FROM a
    WHERE NOT ISNUMERIC(a.Number) 
    

    【讨论】:

    • 发布问题后,我突然“顿悟”按照您的建议检查数据,结果发现数字列中有一些非数字数据的记录。是否进行了一些数据验证并解决了问题。感谢您的快速回复。
    • 为什么是NOT ISNUMERIC() 而不是ISNUMERIC() = 0?恕我直言,否定逻辑可能非常令人困惑。这真的是 Access 中唯一允许的形式吗?
    • 我的理由是,将其作为布尔表达式评估在 SQL Server 中无效,因此我可以在多个平台中使用 same 语法的任何地方。
    • @AaronBertrand - 你提出了一个有效的观点,你的例子将在这种情况下工作;然而,在看到 TSQL 与 Access 中ISNULL 的不同实现(或UpperUCaseCharIndexInStr)之后,我几乎将Access 视为它自己的奇怪生物。这仍然是非常合理的建议,这也是我使用Coalesce 而不是IsNull 的原因(Access 除外... )。
    【解决方案2】:

    运行此查询:

    SELECT a.Number, a.Location, a.Manufacturer
    FROM a
    WHERE (((a.Location) = 'Columbus'))
    

    查询运行后,按 a.Number 对其进行排序;先升后降。我敢打赌,其中一条记录在该字段中有一个空白值,或者一个不是数字的值,并且当您对其进行排序时,该记录将上升到查询的顶部。当您尝试计算随机数时,此字段中任何不是数字的值都会导致数据类型不匹配。

    【讨论】:

      猜你喜欢
      • 2023-01-31
      • 2021-08-18
      • 2011-09-11
      • 2020-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多