sql - SQL Server 是否真的计算 case 表达式中的每个 'then' 子句?

标签 sql sql-server

我正在使用旧系统中的 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/

相关文章:

sql - 棘手的 Postgresql 查询

mysql - 选择 * 以及另一个表中的计数/总和

sql-server - 将动态sql的结果赋值给变量

sql - 当按与 ID 无关的条件排序时,选择出现在具有给定 ID 的行之后的行

java - Spring和Hibernate : Multiple connections,线程安全

sql - 有没有更好的方法来排序这个查询?

sql-server - 在系统版本列可以为空的情况下,将列更改为非空

sql-server - 使用 DATENAME 时的 SQL SET DATEFIRST

c# - 为什么 GETDATE() 在 SSMS 和 C# Microsoft.Practices.EnterpriseLibrary.Data 上运行时会产生不同的结果?

mysql - ORDER BY ASC 未对包含数字的字符串正确生效