>我有一个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?