6

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

(@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'
4

2 回答 2

5

我会选择

if (@a is null and @b is not null) or (@a is not null and @b is null)

我认为这更清楚一些

于 2012-12-05T20:16:29.223 回答
3

好的,如果您正在使用所有字符串,这是一个(尽管很愚蠢)建议。它可以扩展到大于 2 的倍数,您需要特定数量的非空值。再说一次,它很愚蠢,而且不是很短,但是太有趣了,不能提...

where LEN(ISNULL(right(@a+'x',1),'')+ISNULL(right(@b+'x',1),'')) = 1

为了让它与你的东西一起工作,我想你必须 CAST [int]。在匹配之前在 where 子句中执行字符串“手术”是邪恶的,并且可能会很慢。但是,如果您有 6 列并且恰好需要 1 不为空,则此技巧将扩大。

基本上,我们使用 LEN 来计算非空值。+'x'确保您不会将 a视为''空值。您可以在测试 [char] 列时将其关闭。

于 2012-12-05T20:49:51.930 回答