我正在使用旧系统中的 ItemNumber 字段,该字段 99% 是数字,但有一些记录包含字母。这些数字都用前导零填充,所以我想我只需将它们转换为 bigint 来解决这个问题,但当然,当它到达包含字母的记录时,它会抛出错误。
我认为下面的 case 语句会起作用,但它仍然抛出错误。如果 isnumeric(itemnumber) = 1 条件不成立,那么 SQL Server 到底为什么要评估强制转换?
select case when isnumeric(itemnumber) = 1
then cast(itemnumber as bigint)
else itemnumber
end ItemNumber
from items
最好的解决方法是什么?
最佳答案
如果 VARCHAR
值是数字,则表达式会尝试将其转换为 BIGINT
;如果不是数字,则保持该值不变。
由于您在 CASE
语句中混合数据类型,SQL Server
尝试将它们全部转换为 BIGINT
,但在非数字值上失败.
如果您只想省略非数字值,请删除 ELSE
子句:
SELECT CASE ISNUMERIC(itemnumber)
WHEN 1 THEN
CAST(itemnumber AS BIGINT)
END
FROM items
关于sql - SQL Server 是否真的计算 case 表达式中的每个 'then' 子句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16209307/