我在SQL Server 2008中有这样的查询:
SELECT TOP 1 SPECIAL_CODE1 *
FROM CUSTOMERS
WHERE isnumeric(SPECIAL_CODE1)=1
ORDER BY SPECIAL_CODE1 DESC
查询结果返回'9970'
。有些行的列值为'34780'
或'19850'
。
如何更正我的查询?
答案 0 :(得分:4)
'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是一种声明性语言,因此查询引擎可以以您可能不期望的方式重新排列查询的组件。