将varchar值'x'转换为数据类型int时转换失败

时间:2019-08-29 20:02:30

标签: sql sql-server null isnull

我有一个recipient.User.Name条件,该条件适用于STRING类型,但不适用于INT类型

WHERE

但是下面的这种情况会引发错误:

 isnull(emp.name, 'x') <> isnull(mst.name, 'x')  -- works
  

将varchar值'x'转换为数据类型int时转换失败。

其中名称是STRING,年龄是INT类型。

该如何纠正?

3 个答案:

答案 0 :(得分:2)

ISNULL将尝试将第二个参数的数据类型转换为第一个参数的数据类型。字符串x无法转换为int(假设age是int)。使用理想情况下,数据中不存在的整数值:

isnull(emp.age, -1) <> isnull(mst.age, -1)

答案 1 :(得分:2)

请勿为此使用isnull()或什至coalesce()。只需扩展逻辑即可:

where (emp.age = mst.age or emp.age is null and mst.age is null)

可以输入假值并使用coalesce(),但是类型必须保持一致。但是,我认为最好使用显式逻辑来满足您的要求,并且适用于所有数据类型。

答案 2 :(得分:2)

请注意,在您的代码中,'x'实际上将被视为与NULL相同,这不太可能是您想要的。解决您为age遇到的错误将无法解决该问题。

请考虑使用运算符IS DISTINCT FROM,该运算符与<>类似,但将NULL视为“已知值”(例如NULL IS DISTINCT FROM NULL = FALSE)。

emp.name IS DISTINCT FROM mst.name
emp.age IS DISTINCT FROM mst.age

如果您的数据库引擎不支持IS DISTINCT FROM,那么以下相关问题会有所帮助:How to rewrite IS DISTINCT FROM and IS NOT DISTINCT FROM?