SQL Server空逻辑异或

SQL Server空逻辑异或,sql,sql-server,tsql,constraints,xor,Sql,Sql Server,Tsql,Constraints,Xor,我正在(Microsoft)Sql Server 2008表上创建约束。我有两个数据类型不同的列。一列必须始终为空,但不能同时为空(逻辑异或/XOR)。我现在有一个工作表达式 (@a is null or @b is null) and not (@a is null and @b is null) 我的问题是是否有更简洁或更短的方法来编写此代码? 要测试它,您可以使用以下代码 declare @a int declare @b varchar(5) set @a=1 set @b='XXX

我正在(Microsoft)Sql Server 2008表上创建约束。我有两个数据类型不同的列。一列必须始终为空,但不能同时为空(逻辑异或/XOR)。我现在有一个工作表达式

(@a is null or @b is null) and not (@a is null and @b is null)
我的问题是是否有更简洁或更短的方法来编写此代码?

要测试它,您可以使用以下代码

declare @a int
declare @b varchar(5)

set @a=1
set @b='XXXXX'

if (@a is null or @b is null) and not (@a is null and @b is null)
  select 'pass'
else
  select 'fail'
我宁愿

if (@a is null and @b is not null) or (@a is not null and @b is null)
在我看来这更清楚了一点

好吧,如果你使用所有字符串,这里有一个(尽管很愚蠢)的建议。当需要特定数量的非空值时,它会扩展到大于2的倍数。再说一次,它很愚蠢,也不是很短,但它太有趣了,不能不提

where LEN(ISNULL(right(@a+'x',1),'')+ISNULL(right(@b+'x',1),'')) = 1
我想,为了让它与你的东西一起工作,你必须对[int]进行转换。在匹配之前在where子句中进行字符串“手术”是邪恶的,而且很可能非常缓慢。但是,如果您有6列,并且需要正好1才能不为null,那么这个技巧将放大


基本上,我们使用LEN来计算notnull。
+'x'
确保不会将
'
计算为空。你可以在测试[char]列时省去这个选项。

比我快了30秒,得到了一篇几乎完全相同的文章。;-)@Sql威胁+1。感谢您在没有否决表决的情况下指出我的错误。这是Microsoft SQL Server,不是postgresql。语法不支持“!=”。