【问题标题】:Tricky logical XOR for nullable values可空值的棘手逻辑异或
【发布时间】:2023-03-18 06:48:01
【问题描述】:

我有 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 - 它就会导致操作数类型错误。

那么,有什么棘手的解决方案吗?

【问题讨论】:

  • COALESCE(a,b)=COALESCE(b,a) 怎么样 :) 如果a=b 将产生不正确的值。 sqlfiddle.com/#!1/9c33b/1
  • @mellamokb:值得一票,尽管select coalesce(null, null) = coalesce(null, null) 返回的不是布尔值(在某些情况下可能会导致错误)

标签: sql postgresql postgresql-8.4


【解决方案1】:

如果你的意思是完全正确一个是NULL(这符合你现有的逻辑),那么:

a is null != b is null

【讨论】:

  • 惊讶它如此简单:-)
  • @zerkms:我不得不仔细检查,因此快速删除/取消删除:)
  • @mu 太短:是的,我看到它被删除了,想知道你为什么这样做,同时考虑可能的陷阱
  • @zerkms:我陷入了第二次猜测自己的困境,不得不建立真值表以确保我不是type-1 or type-2 白痴。
【解决方案2】:

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

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

(我花了将近 10 分钟试图了解我的 CHECK 出了什么问题。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-23
    • 1970-01-01
    • 1970-01-01
    • 2014-10-07
    相关资源
    最近更新 更多