Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Sử dụng một câu lệnh trường hợp trong một ràng buộc kiểm tra

Tôi nghĩ bạn có thể làm như sau:

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

Vui lòng xem lược đồ SQL Fiddle tại đây.

Bạn không cần UPPER() ràng buộc về salary_grade vì kiểm tra regex sẽ đủ (bạn đã kiểm tra để đảm bảo rằng đó là một chữ cái viết hoa giữa A và G). Tôi không nghĩ rằng có sự ràng buộc đối với salary_scale một mình là cần thiết vì nó sẽ được chứa, về mặt logic, trong ràng buộc cuối cùng.

CẬP NHẬT

Đây là cách bạn có thể làm điều đó với CASE tuyên bố:

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

Vui lòng xem lược đồ SQL Fiddle tại đây.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Đau đầu về định dạng dấu thời gian sqlldr của Oracle

  2. ODP.NET Managed - Không thể tìm thấy Nhà cung cấp Dữ liệu .Net Framework được yêu cầu

  3. Ghi nhật ký đầu ra của chương trình bên ngoài với (wx) python

  4. Làm cách nào để truy vấn nội dung nào đó bắt đầu bằng các ký tự nhất định?

  5. Oracle 11g - Vòng lặp FOR chỉ chèn các ngày trong tuần vào một bảng?