Проверка ИНН

Нужно проверить корректность российского ИНН.

Решение для PostgreSQL

-- inn - проверямая переменная

with a as (
	  select (regexp_split_to_array(inn, '\s*'))::int[] a, length(inn) l
	)
	, k as (
	  select 
	  row_number() over () rn
	  ,p::int + 1  k2
	  ,(lead(p,1) over ())::int + 1 k1
	  ,(lead(p,2) over ())::int + 1 k0
	  from regexp_split_to_table('26139248357',E'\\s*') p
	)
	, m as (
	  select 
	  k.*, 
	  a.a[k.rn] v
	  from k, a
	)
	, v as (
	  select 
	  mod(mod(sum(k2*v), 11) ,10) s2,
	  mod(mod(sum(k1*v), 11) ,10) s1,
	  mod(mod(sum(k0*v), 11) ,10) s0
	  from m
	)
	select
	case 
		when a.l = 10 then v.s0 = a.a[10]
		when a.l = 12 then v.s1 = a.a[11] and v.s2 = a.a[12]
		else false
	end r
	from v, a
Опубликовано 20.02.2019