【问题标题】:SQL Server Null Logical XORSQL Server 空逻辑异或
【发布时间】:2012-12-05 20:13:35
【问题描述】:

我正在 (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'

【问题讨论】:

  • 这是 Microsoft SQL Server,而不是 postgresql。语法不支持“!=”。

标签: sql sql-server tsql constraints xor


【解决方案1】:

我更喜欢

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

在我看来这更清楚一点

【讨论】:

  • 在 30 秒内击败我到几乎相同的帖子。 ;-)
  • @SQLMenace +1。感谢您指出我的错误而不投反对票。
【解决方案2】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2023-03-18
    • 1970-01-01
    • 2014-08-29
    • 2014-10-07
    • 2020-03-22
    • 2018-10-30
    • 1970-01-01
    • 1970-01-01
    • 2011-04-14
    相关资源
    最近更新 更多