-
Notifications
You must be signed in to change notification settings - Fork 144
/
is_ogrn.sql
44 lines (39 loc) · 1.55 KB
/
is_ogrn.sql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
create or replace function public.is_ogrn(str text)
returns boolean
immutable
returns null on null input
parallel safe
language sql
set search_path = ''
cost 2
as
$$
--https://ru.wikipedia.org/wiki/Основной_государственный_регистрационный_номер
--http://www.consultant.ru/cons/cgi/online.cgi?req=doc;base=LAW;n=179683
select octet_length(str) = 13
and str !~ '\D'
and left((left(str, 12)::bigint % 11)::text, 1) = right(str, 1)
$$;
comment on function public.is_ogrn(text) is 'Проверяет, что переданная строка является ОГРН (основной государственный регистрационный номер)';
--TEST
DO $$
BEGIN
--positive
assert public.is_ogrn('0000000000000');
assert public.is_ogrn('1000000000001');
assert public.is_ogrn('1027812400868');
--negative
assert not public.is_ogrn('123456789012');
assert not public.is_ogrn('12345678901234');
assert not public.is_ogrn('102781240086a');
assert not public.is_ogrn('0000000000001');
assert not public.is_ogrn('1000000000000');
assert not public.is_ogrn('1000000000002');
assert not public.is_ogrn('1000000000003');
assert not public.is_ogrn('1000000000004');
assert not public.is_ogrn('1000000000005');
assert not public.is_ogrn('1000000000006');
assert not public.is_ogrn('1000000000007');
assert not public.is_ogrn('1000000000008');
assert not public.is_ogrn('1000000000008');
END $$;