sql >> Database >  >> RDS >> Oracle

Een case-statement gebruiken in een controlebeperking

Ik denk dat je het volgende kunt doen:

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' )
);

Bekijk hier het SQL Fiddle-schema.

Je hebt de UPPER() . niet nodig beperking op salary_grade omdat de regex-controle voldoende is (u controleert al of het een hoofdletter is tussen A en G). Ik denk niet dat de beperking op salary_scale alleen is ofwel noodzakelijk omdat het, logischerwijs, in de laatste beperking zou zitten.

UPDATE

Hier is hoe je het zou kunnen doen met een CASE verklaring:

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 )
);

Bekijk hier het SQL Fiddle-schema.



  1. Hoe orakel TNSPING te doen met Java?

  2. H2 in-memory databasefout Gegevensconversiefout bij het gebruik van UUID als primaire sleutel

  3. Oracle Advanced Queuing met .Net

  4. PL/SQL-gateway in R11i