ray88’s diary

お仕事で困ったとき用の自分用の覚書

SQL指南書 CHECK制約で複数の列の条件関係を定義する(CASE文応用)

SQL 指南書集 目次 - ray88’s diary
■Check制約の条件式にCASE文を使用する
【事例】
女性社員の給料は20万円以下という給与体系をもつ会社の人事テーブルの制約
※「--error」のコメント文のところでエラーとなる。(女性社員の給料が20万円以上で制約違反のため)

CREATE TABLE TestSal
(sex CHAR(1) ,
 salary INTEGER,
    CONSTRAINT check_salary CHECK
             ( CASE WHEN sex = '2'
                    THEN CASE WHEN salary <= 200000
                              THEN 1 ELSE 0 END
                    ELSE 1 END = 1 ));

INSERT INTO TestSal VALUES(1, 200000);
INSERT INTO TestSal VALUES(1, 300000);
INSERT INTO TestSal VALUES(1, NULL);
INSERT INTO TestSal VALUES(2, 200000);
INSERT INTO TestSal VALUES(2, 300000);  --error
INSERT INTO TestSal VALUES(2, NULL);
INSERT INTO TestSal VALUES(1, 300000);

※例えば、以下のように倫理積のCHECK制約を付けると、男性を雇用できない。条件法であれば男性も働ける
※条件法はそもそも社員の性別が女性ではない、あるいは性別不明の場合は真となる。その意味で、倫理積よりも緩い制約であるといえる。

CONSTRAINT check_salary CHECK
             (sex = '2' AND salary <= 200000)

【倫理積と条件法】