Sql 可空值的复杂逻辑异或
我有两个可为空的Sql 可空值的复杂逻辑异或,sql,postgresql,postgresql-8.4,Sql,Postgresql,Postgresql 8.4,我有两个可为空的CHAR列,我需要检查其中是否只有一个为空 做 这很无聊。我希望避免为此创建自定义函数 我在想类似的事情 COALESCE(a, 1) + COALESCE(b, 1) = 1 但只要a是char,就会导致操作数类型错误 那么,有什么棘手的解决方案吗?如果您的意思是正好有一个为空(这与您现有的逻辑相匹配),那么: 如果您使用的是PostgreSQL,请不要忘记括号 ALTER TABLE "schema"."table" ADD CHECK ((key1 IS NULL) &l
CHAR
列,我需要检查其中是否只有一个为空
做
这很无聊。我希望避免为此创建自定义函数
我在想类似的事情
COALESCE(a, 1) + COALESCE(b, 1) = 1
但只要a
是char
,就会导致操作数类型错误
那么,有什么棘手的解决方案吗?如果您的意思是正好有一个为空(这与您现有的逻辑相匹配),那么:
如果您使用的是PostgreSQL,请不要忘记括号
ALTER TABLE "schema"."table" ADD CHECK ((key1 IS NULL) <> (key2 IS NULL));
altertable“schema”。“TABLE”添加检查((key1为NULL)(key2为NULL));
(我花了将近10分钟的时间试图弄明白我的支票出了什么问题。)奇怪它这么简单:-)@zerkms:我不得不再次检查,因此快速删除/取消删除:)@mu太短了:是的,我看到它被删除了,我想知道你为什么这么做,在考虑可能的情况下pitfalls@zerkms:我陷入了事后诸葛亮的困境,不得不建立真值表以确保我不是白痴。如果
a=b
,那么COALESCE(a,b)=COALESCE(b,a)
:)将产生不正确的值@mellamokb:值得投票表决,尽管select coalesce(null,null)=coalesce(null,null)
返回的不是布尔值(在某些情况下可能会导致错误)
a is null != b is null
ALTER TABLE "schema"."table" ADD CHECK ((key1 IS NULL) <> (key2 IS NULL));