0

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

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

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

如何更正我的查询?

4

4 回答 4

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
于 2012-07-14T15:20:04.327 回答
1

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

SELECT ... ORDER BY CAST(SPECIAL_CODE1 as int) DESC
于 2012-07-14T15:21:20.853 回答
1

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

于 2012-07-14T15:24:44.660 回答
1

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

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

case 语句是唯一保证某种评估顺序的语句。如果转换发生在查询中的其他地方,例如在 SELECT 中,那么查询可能会在第一次遇到非数字值时生成错误。

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

于 2012-07-14T15:37:55.427 回答