选择Top Order By查询返回意外结果

时间:2012-07-14 15:15:23

标签: sql sql-server

我在SQL Server 2008中有这样的查询:

SELECT TOP 1 SPECIAL_CODE1 * 
  FROM CUSTOMERS 
 WHERE isnumeric(SPECIAL_CODE1)=1 
ORDER BY SPECIAL_CODE1 DESC

查询结果返回'9970'。有些行的列值为'34780''19850'

如何更正我的查询?

4 个答案:

答案 0 :(得分:4)

如果我们正在谈论字符串值('9'>'3'),则

'9970'大于'34780'。如果它是一个定义为整数的字段,那么事情当然是不同的。尝试像

这样的东西
SELECT TOP 1 SPECIAL_CODE1 * FROM CUSTOMERS 
WHERE isnumeric(SPECIAL_CODE1)=1 
ORDER BY CAST (SPECIAL_CODE1 AS INTEGER) DESC

答案 1 :(得分:1)

该列被存储为字符数据,而不是整数(注意它认为以“99”开头的那个是最高的,即使存在“111”)。解决方案是更改模式以使该列存储整数,或者更改查询以强制转换列:

SELECT ... ORDER BY CAST(SPECIAL_CODE1 as int) DESC

答案 2 :(得分:1)

我看到你正在按SPECIAL_CODE1对结果进行排序。该字段的数据类型是什么?它看起来像是varchar或char。排序时需要转换数据类型。例如,     按阶段排序(SPECIAL_CODE1 AS INT) 这将返回按数字排序的结果,而不是基于charater的排序

答案 3 :(得分:1)

上述查询有效,因为可能会在过滤器之后评估order by。但是,使用case语句包围演员是更安全的:

order by (case when isnumeric(special_code1) = 1 then cast(special_code1 as int) end)

案例陈述是唯一保证某种评估顺序的陈述。如果转换发生在查询的其他位置(例如SELECT中),那么查询可能会在第一次遇到非数字值时生成错误。

SQL是一种声明性语言,因此查询引擎可以以您可能不期望的方式重新排列查询的组件。