2

我正在使用 99% 数字的旧系统中的 ItemNumber 字段,但有一些记录包含字母。这些数字都用前导零填充,所以我想我会将它们转换为 bigint 来解决这个问题,但是当它到达带有字母的记录时,它当然会引发错误。

我认为以下 case 语句会起作用,但它仍然会引发错误。如果 isnumeric(itemnumber) = 1 条件不成立,为什么 SQL Server 还要评估演员表?

select case when isnumeric(itemnumber) = 1 
           then cast(itemnumber as bigint) 
           else itemnumber 
       end ItemNumber
from items

最好的解决方法是什么?

4

3 回答 3

3

如果它是数字,您的表达式会尝试将VARCHAR值转换为 a BIGINT,如果不是,则保持该值不变。

由于您在CASE语句中混合了数据类型,因此SQL Server尝试将它们全部转换为BIGINT但在非数字值上失败。

如果您只想省略非数字值,请删除该ELSE子句:

SELECT  CASE ISNUMERIC(itemnumber)
        WHEN 1 THEN
                CAST(itemnumber AS BIGINT) 
        END
FROM    items
于 2013-04-25T08:07:20.353 回答
0

也许是因为:

ISNUMERIC 对某些不是数字的字符(例如加号 (+)、减号 (-))和有效的货币符号(例如美元符号 ($))返回 1。有关货币符号的完整列表,请参阅 money 和 smallmoney (Transact-SQL)。

http://msdn.microsoft.com/en-us/library/ms186272.aspx

于 2013-04-25T08:03:04.357 回答
0

问题是您仍在混合您的类型:

select case when isnumeric(itemnumber) = 1 
           then cast(itemnumber as bigint) --bigint
           else itemnumber --varchar or whatever 
       end ItemNumber --????
from items

你需要两列

select case when isnumeric(itemnumber) = 1 
           then cast(itemnumber as bigint) --bigint
           else -1 
       end NumericItemNumber 
from items

select case when isnumeric(itemnumber) = 1 
           then ''
           else itemnumber
       end StringItemNumber 
from items

然后你需要构建一个同时接受 int 和 varchars 的查询

于 2013-04-25T08:11:15.020 回答