Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Używanie instrukcji case w ograniczeniu sprawdzającym

Myślę, że możesz wykonać następujące czynności:

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

Zobacz schemat SQL Fiddle tutaj.

Nie potrzebujesz UPPER() ograniczenie salary_grade ponieważ wystarczy sprawdzenie wyrażenia regularnego (już sprawdzasz, aby upewnić się, że jest to wielka litera między A i G). Nie sądzę, aby ograniczenie salary_scale samo jest konieczne, ponieważ logicznie byłoby zawarte w ostatnim ograniczeniu.

AKTUALIZUJ

Oto jak możesz to zrobić za pomocą CASE oświadczenie:

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

Zobacz schemat SQL Fiddle tutaj.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wywołanie Oracle PL/SQL PLS-00201:należy zadeklarować identyfikator '001'

  2. Dlaczego SQL*Plus zatwierdza przy wyjściu?

  3. Próbuję zbudować statyczny plik wykonywalny CGO z bibliotekami Oracle na Linux/Ubuntu

  4. Jak ograniczyć wyniki w Oracle

  5. Zapytanie Oracle o uzyskanie określonej daty