Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 regexp_like и ИНН  [new]
Albatross
Member

Откуда:
Сообщений: 1001
Привет!
Есть выражение

REGEXP_LIKE(txt, '[0-9]{10,12}')

как бы её переписать, чтобы всякие '1234567890ТЕСТ' не пролазили? нужно ровно 10 или ровно 12 цифр.
28 апр 21, 13:03    [22315581]     Ответить | Цитировать Сообщить модератору
 Re: regexp_like и ИНН  [new]
PuM256
Member

Откуда:
Сообщений: 96
^[0-9]{10,12}$
28 апр 21, 13:06    [22315583]     Ответить | Цитировать Сообщить модератору
 Re: regexp_like и ИНН  [new]
Albatross
Member

Откуда:
Сообщений: 1001
PuM256,
спасибо!
28 апр 21, 13:07    [22315585]     Ответить | Цитировать Сообщить модератору
 Re: regexp_like и ИНН  [new]
AmKad
Member

Откуда:
Сообщений: 5273
PuM256
^[0-9]{10,12}$
Нужно ровно 10 или ровно 12. А 11 не нужно.
28 апр 21, 13:09    [22315589]     Ответить | Цитировать Сообщить модератору
 Re: regexp_like и ИНН  [new]
PuM256
Member

Откуда:
Сообщений: 96
Да, не обратил внимания на эту хотелку автора.

^([0-9]{10}|[0-9]{12})$
28 апр 21, 13:19    [22315602]     Ответить | Цитировать Сообщить модератору
 Re: regexp_like и ИНН  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 19050
PuM256
Да, не обратил внимания на эту хотелку автора.

^([0-9]{10}|[0-9]{12})$

^([0-9]{10}([0-9]{2})?)$
28 апр 21, 13:23    [22315606]     Ответить | Цитировать Сообщить модератору
 Re: regexp_like и ИНН  [new]
Алымов Анатолий
Member

Откуда: Оренбург
Сообщений: 1316
Лучше функцию проверки написать с высчитыванием контрольного числа. То что строка содержит 10 или 12 цифр ещё не означает что это ИНН
28 апр 21, 13:45    [22315626]     Ответить | Цитировать Сообщить модератору
 Re: regexp_like и ИНН  [new]
AmKad
Member

Откуда:
Сообщений: 5273
Давайте меряться, чей регэксп короче.
'^\d{10}(\d\d)?$'
28 апр 21, 14:21    [22315655]     Ответить | Цитировать Сообщить модератору
 Re: regexp_like и ИНН  [new]
123йй
Member

Откуда:
Сообщений: 1675
Алымов Анатолий
Лучше функцию проверки написать с высчитыванием контрольного числа. То что строка содержит 10 или 12 цифр ещё не означает что это ИНН

Даже если контрольное число совпадет это тоже не означает что это ИНН
28 апр 21, 14:31    [22315667]     Ответить | Цитировать Сообщить модератору
 Re: regexp_like и ИНН  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 19050
Алымов Анатолий
Лучше функцию проверки написать с высчитыванием контрольного числа. То что строка содержит 10 или 12 цифр ещё не означает что это ИНН

declare
  procedure assert_inn(i_inn varchar2) is
    la_coeff_10 sys.odcinumberlist  := sys.odcinumberlist(2,4,10,3,5,9,4,6,8,0);
    la_coeff_121 sys.odcinumberlist := sys.odcinumberlist(7,2,4,10,3,5,9,4,6,8,0);
    la_coeff_122 sys.odcinumberlist := sys.odcinumberlist(3,7,2,4,10,3,5,9,4,6,8,0);
    procedure assert_cs(i_inn varchar2, io_coeff in out nocopy sys.odcinumberlist) is
      l_calc number := 0;
    begin
      for i in 1..io_coeff.count loop
        l_calc := l_calc + io_coeff(i)*to_number(substr(i_inn,i,1),'0');
      end loop;
      case to_char(mod(mod(l_calc,11),10),'fm0') 
        when substr(i_inn,io_coeff.count,1) then null;
        else raise_application_error(-20000,'ИНН не валиден: "'||i_inn||'"');
      end case;       
    end;
  begin
    case length(i_inn)
      when 10 then
        assert_cs(i_inn,la_coeff_10);
      when 12 then
        assert_cs(i_inn,la_coeff_121);
        assert_cs(i_inn,la_coeff_122);
    else
      raise VALUE_ERROR;
    end case;
  exception
    when VALUE_ERROR then
      raise_application_error(-20000,'ИНН должен состоять из 10 либо 12 цифр, получено "'||i_inn||'"');
  end;
begin
  assert_inn('7830002293');
  assert_inn('500100732259');
end;
/
28 апр 21, 14:32    [22315668]     Ответить | Цитировать Сообщить модератору
 Re: regexp_like и ИНН  [new]
Sayan Malakshinov
Member

Откуда: Мск
Сообщений: 5873
AmKad
Давайте меряться, чей регэксп короче.
'^\d{10}(\d\d)?$'
давай
with v(s) as (
select '012345678' from dual union all
select '0123456789' from dual union all
select '01234567890' from dual union all
select '012345678901' from dual union all
select '0123456789012' from dual 
)
select
  case when regexp_like(s, '^\d{10}(\d\d)?$') then 'y' else 'n' end amkad
 ,case when regexp_like(s, '^(\d{2}){5,6}$') then 'y' else 'n' end mine
from v
/
28 апр 21, 15:16    [22315694]     Ответить | Цитировать Сообщить модератору
 Re: regexp_like и ИНН  [new]
AmKad
Member

Откуда:
Сообщений: 5273
Sayan Malakshinov
давай
Уделал.
28 апр 21, 15:31    [22315702]     Ответить | Цитировать Сообщить модератору
 Re: regexp_like и ИНН  [new]
Sayan Malakshinov
Member

Откуда: Мск
Сообщений: 5873
AmKad
Sayan Malakshinov
давай
Уделал.
и даже группа тут не нужна:
with v(s) as (
select '012345678' from dual union all
select '0123456789' from dual union all
select '01234567890' from dual union all
select '012345678901' from dual union all
select '0123456789012' from dual 
)
select
  case when regexp_like(s, '^\d{10}(\d\d)?$') then 'y' else 'n' end amkad
 ,case when regexp_like(s, '^(\d{2}){5,6}$') then 'y' else 'n' end mine
 ,case when regexp_like(s, '^\d{2}{5,6}$') then 'y' else 'n' end mine2
from v
/
28 апр 21, 15:46    [22315716]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить