Oracle: проверка ограничений для буквенных и цифровых символов в varchar2


Поэтому я хочу проверить, что varchar2 имеет формат 4 буквенных символов, а затем 3 числовых символа, например AABB123 или LMNO987

До сих пор я пытался:

CONSTRAINT Code_Check check (REGEXP_LIKE(Code,'[^A-Z][^A-Z][^A-Z][^A-Z][0-9][0-9][0-9]'))

CONSTRAINT Check_Code check (Code LIKE '[^A-Z][^A-Z][^A-Z][^A-Z][0-9][0-9][0-9]'

CONSTRAINT Check_Code check (Code LIKE '[A-Z][A-Z][A-Z][A-Z][0-9][0-9][0-9]')

CONSTRAINT Check_Code check (Code regexp_LIKE '[A-Z][A-Z][A-Z][A-Z][0-9][0-9][0-9]')

CONSTRAINT Check_Code check (Code LIKE '[^A-Z]{4}[0-9]{3}')

Но просто получите ошибку:

insert into Table1 (Code) values ('HELP555')
Error report:
SQL Error: ORA-02290: check constraint (BOB.TABLE1_CHECK_CODE) violated
02290. 00000 - "check constraint (%s.%s) violated"
*Cause: The values being inserted do not satisfy the named check
*Action: do not insert values that violate the constraint.
1 2

1 ответ:

Регулярные выражения неверны, и способ, которым вы их использовали, довольно громоздок.

Вместо этого вы можете использовать классы символов POSIX. В вашем конкретном случае это будет выглядеть так:

[[:alpha:]]{4}[[:digit:]]{3}

Таким образом, проверка ограничений является

CONSTRAINT Code_Check check (REGEXP_LIKE(Paper_Code,'[[:alpha:]]{4}[[:digit:]]{3}')

При этом проверяется наличие 4 буквенных символов, за которыми следуют 3 числовых.

Пример на SQL fiddle & более подробная информация доступна на regexp cheatsheet