可空值的棘手逻辑XOR

时间:2012-04-18 03:21:11

标签: sql postgresql postgresql-8.4

我有2个可为空的CHAR列,我需要检查其中只有一个是否为空。

否则

(a IS NULL AND b IS NOT NULL) OR (a IS NOT NULL AND b IS NULL)

很无聊。我想避免为此创建自定义函数。

我在考虑像

这样的东西
COALESCE(a, 1) + COALESCE(b, 1) = 1

但只要achar - 就会导致操作数类型错误。

那么,任何棘手的解决方案?

2 个答案:

答案 0 :(得分:25)

如果你的意思是完全一个是NULL(它与你现有的逻辑相匹配),那么:

a is null != b is null

答案 1 :(得分:7)

如果您正在使用PostgreSQL,请不要忘记括号......

ALTER TABLE "schema"."table" ADD CHECK ((key1 IS NULL) <> (key2 IS NULL));

(我花了差不多10分钟试图了解我的CHECK有什么问题。)