可空值的棘手逻辑XOR

zer*_*kms 12 sql postgresql postgresql-8.4

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

(a IS NULL AND b IS NOT NULL) OR (a IS NOT NULL AND b IS NULL)
Run Code Online (Sandbox Code Playgroud)

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

我在考虑类似的事情

COALESCE(a, 1) + COALESCE(b, 1) = 1
Run Code Online (Sandbox Code Playgroud)

但只要achar- 它会导致操作数类型错误.

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

mu *_*ort 25

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

a is null != b is null
Run Code Online (Sandbox Code Playgroud)


Hug*_*res 7

如果您使用的是PostgreSQL,请不要忘记括号......

ALTER TABLE "schema"."table" ADD CHECK ((key1 IS NULL) <> (key2 IS NULL));
Run Code Online (Sandbox Code Playgroud)

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