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

Моля, вижте схемата на SQL Fiddle тук.

Нямате нужда от 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 )
);

Моля, вижте схемата на SQL Fiddle тук.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pivot/Crosstab Query в Oracle 10g (Динамичен номер на колона)

  2. Обърнете в Oracle този път z/y/x към x/y/z

  3. Как да изтрия тригер в oracle, който съдържа специален символ?

  4. Как да обработваме изключенията to_date в оператор SELECT, за да игнорирате тези редове?

  5. Нулиране на кумулативна сума?