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



>我有一个WHERE条件,它适用于字符串类型,但不适用于 INT 类型失败

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

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

isnull(emp.age, 'x') <> isnull(mst.age, 'x')   -- fails

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

其中 name 是字符串,年龄是 INT 类型。

如何纠正?

不要将isnull()用于此目的 - 甚至不要coalesce()。 只需扩展逻辑:

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

你可以输入一个假值并使用coalesce(),但类型需要一致。 但是,我认为最好使用显式逻辑来执行您想要的操作并适用于所有数据类型。

ISNULL将尝试将第二个参数的数据类型转换为第一个参数的数据类型。字符串x不能转换为 int(假设年龄为 int(。使用数据中不存在的整数值:

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

请注意,在您的代码中,'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那么这个相关问题将很有帮助:如何重写 IS DISTINCT FROM 和 IS NOT DISTINCTFROM?

相关内容

  • 没有找到相关文章

最新更新