【问题标题】:SQL ISNUMERIC is returning odd results [duplicate]SQL ISNUMERIC 返回奇数结果 [重复]
【发布时间】:2019-05-09 19:05:56
【问题描述】:

所以我有这个查询:

SELECT 
    *
FROM
    (SELECT * FROM PE_ProductInstance WHERE ISNUMERIC(SerialStart) = 1) p
where 
    CAST(SerialStart AS int) < 8174

理论上,子查询应该过滤掉SerialStart 列不是数字的任何结果。事实上,当我查看以下结果时:

 SELECT * FROM PE_ProductInstance WHERE ISNUMERIC(SerialStart) = 1

SerialStart 的所有结果确实是数字。所以我不明白为什么该查询会导致此错误:

将 nvarchar 值“8A0357”转换为数据类型 int 时转换失败。

还有什么奇怪的是这个查询什么都不返回:

SELECT
    *
FROM
    (SELECT * FROM PE_ProductInstance WHERE ISNUMERIC(SerialStart) = 1) p
where 
    SerialStart  = '8A0357'

我在这里做错了什么?

【问题讨论】:

  • 8A0357 不是数字,您正在执行 CAST(SerialStart AS int)
  • 阅读这篇文章。 sqlservercentral.com/articles/…
  • @Hasan 我明白这一点。但是为什么子查询没有过滤掉'8A0357'?
  • 不要使用ISNUMERIC,使用TRY_CONVERTTRY_CAST。但是如果SerialStart 一个数字,你为什么要传递8A9357?那不是一个数字。也许你的意思是颠倒逻辑,应该是`= 0`(或者更确切地说,TRY_CONVERT 返回NULL
  • ISNUMERIC 上的过滤器可能发生在 CAST 之后,尽管您使用了子查询。这就是这里正在发生的事情。 ISNUMERIC('8A0357') 返回 0CAST 无论如何都会在它上面运行。

标签: sql sql-server tsql sql-server-2017


【解决方案1】:

Try_Cast 是执行此操作的正确方法。请参阅此代码:

DECLARE @table TABLE( 
    id int identity(1,1),
    name varchar(100));

INSERT into @table
VALUES
('1111'),('8A0357');

SELECT *
FROM @table p
WHERE TRY_CAST(p.Name AS int) < 8174;

【讨论】:

  • 你应该删除整个 ISNUMERIC 检查,因为 try_CAST(p.Name AS int) &lt; 8174 只会返回成功转换为 int 的值
  • 啊!我试图将 Try_Cast 放在子查询中
猜你喜欢
  • 2013-03-29
  • 1970-01-01
  • 2011-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-11
相关资源
最近更新 更多