5

整数列 Col1、Col2、Col3、Col4 を持つテーブルがあるとします。各列は NULL 可能であり、有効な行には正確に 1 列の値が含まれている必要があります (つまり、すべての NULL は無効であり、複数の列も無効です)。

現時点では、このようなチェック制約があります

ALTER TABLE [dbo].[MyTable]  WITH CHECK 
    ADD CONSTRAINT [CK_ReportTemplateAttributes] CHECK  
    ((
        [Col1] IS NOT NULL AND [Col2] IS NULL AND [Col3] IS NULL AND [Col4] IS NULL
        OR 
        [Col1] IS NULL AND [Col2] IS NOT NULL AND [Col3] IS NULL AND [Col4] IS NULL
        OR 
        [Col1] IS NULL AND [Col2] IS NULL AND [Col3] IS NOT NULL AND [Col4] IS NULL
        OR 
        [Col1] IS NULL AND [Col2] IS NULL AND [Col3] IS NULL AND [Col4] IS NOT NULL
    ));
GO;

それは機能しますが、同じ結果を達成するためのよりエレガントな方法があるかもしれないと思います(たとえば、この質問者は少なくとも1つのフィールドがnullではないことを確認したいと考えてCOALESCEおり、その場合はキーワードがうまく機能します).

4

2 に答える 2

9

ここで他の答えをリフするために、これはもう少し自己文書化されていると思います:

ALTER TABLE [dbo].[MyTable]  WITH CHECK 
ADD CONSTRAINT [CK_ReportTemplateAttributes] CHECK  
(1 = CASE when [Col1] IS NULL THEN 0 ELSE 1 END + 
     CASE when [Col2] IS NULL THEN 0 ELSE 1 END + 
     CASE when [Col3] IS NULL THEN 0 ELSE 1 END + 
     CASE when [Col4] IS NULL THEN 0 ELSE 1 END ) ;

また、制約を変更して別の列を考慮に入れるが、「3」を「[制約内の列数] - 1」に更新するのを忘れるバグを回避するという利点もあります。

于 2011-08-24T13:00:41.147 に答える
7

私が現時点で考えることができる最も簡潔な方法はです。

ALTER TABLE [dbo].[MyTable]  WITH CHECK 
ADD CONSTRAINT [CK_ReportTemplateAttributes] CHECK  
(3 = ISNULL([Col1] - [Col1],1) + 
     ISNULL([Col2] - [Col2],1) + 
     ISNULL([Col3] - [Col3],1) + 
     ISNULL([Col4] - [Col4],1)) ;
于 2011-08-24T10:54:24.257 に答える