我在 SQL Server 2008 中有这样的查询:
SELECT TOP 1 SPECIAL_CODE1 *
FROM CUSTOMERS
WHERE isnumeric(SPECIAL_CODE1)=1
ORDER BY SPECIAL_CODE1 DESC
查询结果返回为'9970'
。有些行的列值为'34780'
or '19850'
。
如何更正我的查询?
我在 SQL Server 2008 中有这样的查询:
SELECT TOP 1 SPECIAL_CODE1 *
FROM CUSTOMERS
WHERE isnumeric(SPECIAL_CODE1)=1
ORDER BY SPECIAL_CODE1 DESC
查询结果返回为'9970'
。有些行的列值为'34780'
or '19850'
。
如何更正我的查询?
如果我们谈论的是字符串值('9' > '3'),'9970' 大于 '34780'。如果它是一个定义为整数的字段,那么情况当然会有所不同。尝试类似的东西
SELECT TOP 1 SPECIAL_CODE1 * FROM CUSTOMERS
WHERE isnumeric(SPECIAL_CODE1)=1
ORDER BY CAST (SPECIAL_CODE1 AS INTEGER) DESC
该列被存储为字符数据,而不是整数(注意它认为以“99”开头的那个是最高的,即使有一个“111”)。解决方案是更改您的架构以使该列存储整数,或更改您的查询以强制转换列:
SELECT ... ORDER BY CAST(SPECIAL_CODE1 as int) DESC
我看到您正在按 SPECIAL_CODE1 对结果进行排序。该字段的数据类型是什么?它看起来像是 varchar 或 char。排序时需要转换数据类型。例如, ORDER BY CAST(SPECIAL_CODE1 AS INT) 这将返回按数字排序的结果,而不是基于字符的排序
上述查询有效,因为 order by 可能会在过滤器之后进行评估。但是,用 case 语句包围演员表更安全:
order by (case when isnumeric(special_code1) = 1 then cast(special_code1 as int) end)
case 语句是唯一保证某种评估顺序的语句。如果转换发生在查询中的其他地方,例如在 SELECT 中,那么查询可能会在第一次遇到非数字值时生成错误。
SQL 是一种声明性语言,因此查询引擎可以以您可能意想不到的方式重新排列查询的组件。