Используйте регулярное выражение ^( +|[A-Z '.-]*[A-Z][A-Z '.-]*)$
для сопоставления строки, состоящей только из:
+
всех пробелов;или [A-Z '.-]*[A-Z][A-Z '.-]*
ноль или более алфавитных или специальных символов, затем один алфавитный символ, а затем ноль или более алфавитных или специальных символов.
Примерно так:
Oracle Setup :
CREATE TABLE data (
value VARCHAR2(100),
CONSTRAINT value__alpha_or_special_chr CHECK ( REGEXP_LIKE( value, '^( +|[A-Z ''.-]*[A-Z][A-Z ''.-]*)$' ) )
);
Вставить действительные данные :
INSERT INTO data ( value )
SELECT q'!ORACLE!' FROM DUAL UNION ALL
SELECT q'!ORA..C L--E!' FROM DUAL UNION ALL
SELECT q'!'''..O!' FROM DUAL UNION ALL
SELECT q'!O--...''''!' FROM DUAL UNION ALL
SELECT q'! !' FROM DUAL
Ошибка неверных данных :
INSERT INTO data ( value )
SELECT q'!''''''''''!' FROM DUAL;
ORA-02290: check constraint (FIDDLE_TRJCYMMSYLSIPALCEYXD.VALUE__ALPHA_OR_SPECIAL_CHR) violated
INSERT INTO data ( value )
SELECT q'!--------!' FROM DUAL;
ORA-02290: check constraint (FIDDLE_TRJCYMMSYLSIPALCEYXD.VALUE__ALPHA_OR_SPECIAL_CHR) violated
INSERT INTO data ( value )
SELECT q'!ORACLE$!' FROM DUAL;
ORA-02290: check constraint (FIDDLE_TRJCYMMSYLSIPALCEYXD.VALUE__ALPHA_OR_SPECIAL_CHR) violated
INSERT INTO data ( value )
SELECT q'!ORACL#E!' FROM DUAL;
ORA-02290: check constraint (FIDDLE_TRJCYMMSYLSIPALCEYXD.VALUE__ALPHA_OR_SPECIAL_CHR) violated
Запрос :
SELECT * FROM data;
Вывод :
| VALUE |
| :----------- |
| ORACLE |
| ORA..C L--E |
| '''..O |
| O--...'''' |
| |
дБ <> скрипка здесь