逻辑XOR和NULL检查

时间:2014-02-05 17:01:39

标签: sql sql-server sql-server-2012

我有这个检查约束,

CONSTRAINT [CK_VerboseXNOR] CHECK
    (([A] IS NULL AND [B] IS NULL) OR ([A] IS NOT NULL AND [B] IS NOT NULL))

它声称AB都是NULL或两者都不是NULL。您可以考虑XNOR操作。

有没有更简洁的方法在TSQL中编写它,避免每个术语的双重使用。


理想情况下,我喜欢这样(你不能阻止我做梦。)

CONSTRAINT [CK_SuccinctXNOR] CHECK ([A] IS NULL XNOR [B] IS NULL)

修改

我试过了

CHECK (CASE WHEN [A] IS NULL THEN [B] IS NULL ELSE [B] IS NOT NULL END)

这看起来只有三次评估,但是它已经完成了工作(不会解析)。

我还没试过

CHECK (IIF([A] IS NULL, [B] IS NULL, [B] IS NOT NULL))

鉴于上述失败,我不乐观尝试。

我无法理解CHECK如何接受逻辑表达式,但CASE(和perahps IIF)无法返回一个。

2 个答案:

答案 0 :(得分:3)

XNOR就是等于。 XOR不等于。

因为T-SQL中没有布尔类型(没有充分理由),我们必须滥用整数:

WHERE
 (CASE WHEN [A] IS NULL THEN 1 ELSE 0 END)
 = (CASE WHEN [B] IS NULL THEN 1 ELSE 0 END)

也不漂亮。

马丁的变体略胜一筹:

WHERE IIF(A IS NULL, 0, 1) = IIF(B IS NULL, 0, 1)

我通常使用你在问题中写的表格。优化器识别此形式(例如,用于索引搜索)但它不识别基于整数的形式。

答案 1 :(得分:0)

如何编写一个执行XNOR的函数并在约束中调用它?

我自己从来没有这样做,但谷歌弹出:Check Constraints That Call Functions