9

4列のテーブルがあります:

(ID (PK, int, NOT NULL), col1 (NULL), col2 (NULL), col3 (NULL))

制約を追加したいと思いCHECKます(テーブルレベルだと思いますか?)。

if col1 OR col2 are NOT NULL then col3 must be NULL

if col3 is NOT NULL then col1 AND col2 must be NULL

つまり、 ifおよびare not null またはその逆であるcol3必要がありますnullcol1col2

私はSQLとSQLサーバーに非常に慣れていませんが、これを実際に実装する方法、または実装できる/実装する必要があるかどうかさえわかりませんか?

私は多分思う:

CHECK ( (col1 NOT NULL OR col2 NOT NULL AND col3 NULL) OR 
        (col3 NOT NULL AND col1 NULL AND col2 NULL) )

しかし、括弧を使用してこのようにロジックをグループ化できるかどうかはわかりませんか? そうでない場合、これをどのように実装するのが最善ですか?

4

3 に答える 3

11

絶対に、これを行うことができます。このsqlfiddleを参照してください。

ただし、ロジックが適切にブラケットされていることを確認する必要があります。同じ括弧内に AND と OR を混在させないでください。そう:

(col1 NOT NULL OR col2 NOT NULL AND col3 NULL)

なる必要があります:

((col1 NOT NULL OR col2 NOT NULL) AND col3 NULL)

または:

(col1 NOT NULL OR (col2 NOT NULL AND col3 NULL))

あなたの意図次第です。

于 2013-08-09T12:17:44.893 に答える
4

ブラケットを間違えないように注意してください。

CREATE TABLE Test1 (col1 INT, col2 INT, col3 INT);


ALTER TABLE Test1 
ADD CONSTRAINT CHK1
CHECK  (((col1 IS NOT NULL OR col2 IS NOT NULL) AND col3 IS NULL) OR 
        ((col1 IS NULL AND col2 IS NULL) AND col3 IS NOT NULL))



INSERT INTO Test1 VALUES (1,1,1); --fail
INSERT INTO Test1 VALUES (1,1,NULL); --good
INSERT INTO Test1 VALUES (1,NULL,NULL); --good
INSERT INTO Test1 VALUES (1,NULL,1); --fail
INSERT INTO Test1 VALUES (NULL,NULL,1); --good
于 2013-08-09T12:27:10.320 に答える
1

以下のようなUDFを作成すると思います

create FUNCTION dbo.fn_check_val
  (@col1 int , @col2 int , @col3 int)
RETURNS bit
AS
BEGIN
    declare @toRet bit
    IF(@col1 is Not null OR @col2 is NOT NULL)
    Begin
        if(@col3 is null)
        Begin
            Set @toRet = 1
        End
        Else
        Begin
            Set @toRet = 0
        End
    End
    Else
    if(@col3 is not null)
    Begin
        Set @toRet = 1
    End
    Else
    Begin
        Set @toRet = 0
    End
return @toRet
END

次に、テーブルに次のチェックステートメントを追加します

([dbo].[fn_check_val]([col1],[col2],[col3])=(1))
于 2013-08-09T12:34:49.287 に答える