sql >> データベース >  >> RDS >> Oracle

チェック制約でのcaseステートメントの使用

    次のことができると思います:

    CREATE TABLE Grade
    (
      salary_grade    char(1) NOT NULL CHECK (REGEXP_LIKE(salary_grade, '[A-G]', 'c')),
      salary_scale    char(2) DEFAULT 'S1' NOT NULL,
      CONSTRAINT pk_grade PRIMARY KEY (salary_grade),
      CONSTRAINT ck_grade_scale CHECK ( REGEXP_LIKE(salary_grade, '[A-D]', 'c') AND salary_scale = 'S1'
                                     OR REGEXP_LIKE(salary_grade, '[E-G]', 'c') AND salary_scale = 'S2' )
    );
    

    ここでSQLFiddleスキーマを参照してください。

    UPPER()は必要ありません salary_gradeの制約 正規表現チェックで十分なので(AとGの間の大文字であることを確認するためにすでにチェックしています)。 salary_scaleの制約はないと思います 論理的には最後の制約に含まれるため、単独で必要です。

    更新

    CASEを使用してこれを行う方法は次のとおりです。 ステートメント:

    CREATE TABLE Grade
    (
      salary_grade    char(1) NOT NULL CHECK (REGEXP_LIKE(salary_grade, '[A-G]', 'c')),
      salary_scale    char(2) DEFAULT 'S1' NOT NULL,  
      CONSTRAINT pk_grade PRIMARY KEY (salary_grade),
      CONSTRAINT ck_grade_scale CHECK ( salary_scale = CASE WHEN REGEXP_LIKE(salary_grade, '[A-D]', 'c') THEN 'S1' ELSE 'S2' END )
    );
    

    ここでSQLFiddleスキーマを参照してください。



    1. MySQLは日付範囲の間隔でグループ化されます

    2. バックエンドバージョンは、データベース図またはテーブルの設計にはサポートされていません

    3. postgresqlですべてのテーブルのトリガーを作成するにはどうすればよいですか?

    4. SQL Server 2008 で、あるデータベースのレコードを別のデータベースの値で更新しますか?