Как применить ограничение к любой переменной, чтобы в оракуле она заняла всего 5 цифр - PullRequest
2 голосов
/ 07 февраля 2012

Предположим, я хочу создать таблицу ABC, в которой есть столбец, а именно UniqueAddress.

Я хочу, чтобы он занимал 30 символов, в которых требуется всего 5 цифровых символов.

Какой правильный запрос для него?

Ответы [ 2 ]

2 голосов
/ 07 февраля 2012

Опираясь на ответ @ Бена, я бы использовал REGEXP_REPLACE вместо всех переводов и замен и т. Д.

alter table <table_name>    
  add constraint unique_address_chk
check ( LENGTH(REGEXP_REPLACE(unique_address, '[^0-9]+', '')) <= 5);

Это аккуратнее, но выполняет ту же работу.

Регулярное выражение эффективно удаляет все нечисловые символы, а затем функция длины возвращает длину оставленного строки (чисел).

Что касается столбца, содержащего только 30 символов, вы указываете это при создании столбца как VARCHAR2(30 CHAR)

Надеюсь, это поможет ...

1 голос
/ 07 февраля 2012

Я думаю, что это вызовы 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...