sql >> Databáze >  >> RDS >> Oracle

Použití případu v kontrolním omezení

Myslím, že můžete udělat následující:

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

Prohlédněte si schéma SQL Fiddle zde.

Nepotřebujete UPPER() omezení na salary_grade protože kontrola regulárního výrazu bude stačit (už kontrolujete, zda se jedná o velké písmeno mezi A a G). Nemyslím si, že omezení na salary_scale samotný je nezbytný, protože by byl logicky obsažen v posledním omezení.

AKTUALIZACE

Zde je návod, jak to udělat pomocí CASE prohlášení:

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

Prohlédněte si schéma SQL Fiddle zde.



  1. MYSQL Jak spojit dvě slova ve větě

  2. Je vaše databáze zabezpečená? Zamyslete se znovu

  3. Formát data v MySQL SELECT jako ISO 8601

  4. předání názvu tabulky jako parametru plsql