我有一个recipient.User.Name
条件,该条件适用于STRING类型,但不适用于INT类型
WHERE
但是下面的这种情况会引发错误:
isnull(emp.name, 'x') <> isnull(mst.name, 'x') -- works
将varchar值'x'转换为数据类型int时转换失败。
其中名称是STRING,年龄是INT类型。
该如何纠正?
答案 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?