Sql 将varchar值“x”转换为数据类型int时,转换失败

Sql 将varchar值“x”转换为数据类型int时,转换失败,sql,sql-server,null,isnull,Sql,Sql Server,Null,Isnull,我有一个WHERE条件,它对字符串类型有效,但对INT类型无效 isnull(emp.name, 'x') <> isnull(mst.name, 'x') -- works 但以下条件会引发错误: isnull(emp.age, 'x') <> isnull(mst.age, 'x') -- fails 将varchar值“x”转换为数据类型int时,转换失败 其中name是字符串,age是INT类型 如何更正此问题?ISNULL将尝试将第二个参数的数据类

我有一个WHERE条件,它对字符串类型有效,但对INT类型无效

 isnull(emp.name, 'x') <> isnull(mst.name, 'x')  -- works
但以下条件会引发错误:

 isnull(emp.age, 'x') <> isnull(mst.age, 'x')   -- fails
将varchar值“x”转换为数据类型int时,转换失败

其中name是字符串,age是INT类型

如何更正此问题?

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

isnull(emp.age, -1) <> isnull(mst.age, -1)
不要为此目的使用isnull,甚至不要合并。只需扩展逻辑:

where (emp.age = mst.age or emp.age is null and mst.age is null)
您可以输入一个假值并使用coalesce,但类型需要一致。但是,我认为最好使用显式逻辑,它可以满足您的需要,并适用于所有数据类型。

请注意,在您的代码中,“x”实际上被视为与NULL相同,这不太可能是您想要的。修复因年龄而产生的错误不会纠正该问题

请考虑改用运算符IS DISTINCT FROM,这与类似,但将NULL视为已知值。例如,NULL与NULL=FALSE不同

emp.name IS DISTINCT FROM mst.name
emp.age IS DISTINCT FROM mst.age
如果您的数据库引擎不支持不同于的,则此相关问题将很有帮助:

OP正在使用。你需要一个更长的逻辑。