Sql server 某些列应全部填充或全部为空

Sql server 某些列应全部填充或全部为空,sql-server,tsql,check-constraints,Sql Server,Tsql,Check Constraints,我的表(10列)有4列(A、B、C、D),它们应该全部为空或全部填充 我试着用以下方法来做: constraint chk_same check (A is not null AND B is not null And C is not null AND is not null) OR (A is null AND B is null And C is null AND D is null) 看起来很糟糕,有更好/更简单的方法吗?你的方法很好。更通用的方法是计算NULL值的数量,并检查: co

我的表(10列)有4列(A、B、C、D),它们应该全部为空或全部填充

我试着用以下方法来做:

constraint chk_same check (A is not null AND B is not null And C is not null AND is not null) OR (A is null AND B is null And C is null AND D is null)

看起来很糟糕,有更好/更简单的方法吗?

你的方法很好。更通用的方法是计算
NULL
值的数量,并检查:

constraint chk_same
    check ( ((case when A is null then 1 else 0 end) +
             (case when B is null then 1 else 0 end) +
             (case when C is null then 1 else 0 end) +
             (case when D is null then 1 else 0 end)
            ) in (0, 4)
          ) ;

这更一般,因为您可以随时检查4列中的2列或4列中的3列是否具有
NULL
值。

您的方法很好。更通用的方法是计算
NULL
值的数量,并检查:

constraint chk_same
    check ( ((case when A is null then 1 else 0 end) +
             (case when B is null then 1 else 0 end) +
             (case when C is null then 1 else 0 end) +
             (case when D is null then 1 else 0 end)
            ) in (0, 4)
          ) ;

这更一般,因为您可以随时检查4列中的2列或4列中的3列是否具有
NULL
值。

如果列都是相同的数据类型,您可以使用
Coalesce(A、B、C、D)为NULL
检查它们是否都为NULL。不幸的是,这对检查的较大的
不为NULL
端没有帮助。Linoff博士的答案清晰有效。如果列都是相同的数据类型,您可以使用
Coalesce(A,B,C,D)is NULL
检查它们是否都为NULL。不幸的是,这对检查的较大的
不为NULL
端没有帮助。Linoff博士的答案是明确而有效的。因此,它的工作方式是将所有情况相加,并检查求和值是否为列表(0,4)中的一个,对吗?我还可以为a设置一个条件,当它为空或与值2和3不同时?所以类似这样:
当A为null或(不是2也不是3)时,则1其他0结束
@Pomme。对你的两个问题都是肯定的。@Pomme当A为NULL或A不在(2,3)中时,这将是
情况,然后1 else 0 end
。因此,它的工作方式是将所有情况相加,并检查求和值是否是列表(0,4)中的一个,对吗?我还可以为A设置一个条件,当它为NULL或不同于值2和3时?所以类似这样:
当A为null或(不是2也不是3)时,则1其他0结束
@Pomme。您的两个问题都是肯定的。@Pomme当A为NULL或A不在(2,3)中时,则为
情况,然后为1 else 0 end