Я думаю, что это вызовы translate
, которые могут выглядеть страшно, но творит чудеса ... Я надеюсь, что в вашем столбце уже всего 30 символов, поэтому вам не нужно включать это условие в ограничение.
Будет работать что-то вроде следующего:
alter table ABC
add constraint abc_unique_address_chk
check ( length(replace( translate( lower(unique_address)
,translate( lower(unique_address)
,'1234567890',' ')
,' ')
,' ')
) <= 5);
Это переводит все числовые символы в столбце в пробел или в ничто, а затем дает вам все остальные символы. Затем я использую этот список для перевода всех нецифровых символов в пробел или ничего, заменяю пробелы, и вы остаетесь со всеми цифрами.
SQL> create table abc ( unique_address varchar2(30));
Table created.
SQL>
SQL> alter table ABC
2 add constraint abc_unique_address_chk
3 check ( length(replace( translate( lower(unique_address)
4 ,translate( lower(unique_address)
5 ,'1234567890',' ')
6 ,' ')
7 ,' ')
8 ) <= 5);
Table altered.
SQL>
SQL> insert into abc values ( 'Hi, my name is Ben 12345');
1 row created.
SQL> commit;
Commit complete.
SQL> insert into abc values ( 'This has 6 numbers 12345');
insert into abc values ( 'This has 6 numbers 12345')
*
ERROR at line 1:
ORA-02290: check constraint (INBOUND.ABC_UNIQUE_ADDRESS_CHK) violated
SQL> commit;
Commit complete.
SQL>