我有这个检查约束,
CONSTRAINT [CK_VerboseXNOR] CHECK
(([A] IS NULL AND [B] IS NULL) OR ([A] IS NOT NULL AND [B] IS NOT NULL))
它声称A
和B
都是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
)无法返回一个。
答案 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