Skip to content

Instantly share code, notes, and snippets.

@NielsLiisberg
Created November 5, 2019 23:25
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save NielsLiisberg/1a2e9c221a23df1fed964dca7da33e1e to your computer and use it in GitHub Desktop.
Save NielsLiisberg/1a2e9c221a23df1fed964dca7da33e1e to your computer and use it in GitHub Desktop.
SQL modulus 10 LUHN check and calculation
-------------------------------------------------------
-- Implements LUHN modulus 10 for credit card checksum
-- Niels Liisberg
-------------------------------------------------------
create or replace function qusrsys.modulus10 (inString varchar(32))
returns int
language sql
reads sql data
returns null on null input
no external action
deterministic
set option dbgview = *source , output=*print
begin atomic
declare len int default 0;
declare checksum int default 0;
declare d int default 0;
declare parity int default 0;
set len = length(inString);
set parity = mod ( len , 2);
while len > 0 do
set d = int(substring(inString , len ,1));
if mod (len , 2) <> parity then
set d = d *2;
if d > 9 then
set d = d -9;
end if;
end if;
set checksum = checksum + d;
set len = len - 1;
end while;
return mod ( checksum , 10 ) ;
end;
create or replace function qusrsys.modulus10calculate (inString varchar(32))
returns int
language sql
reads sql data
returns null on null input
no external action
deterministic
set option dbgview = *source , output=*print
begin atomic
declare len int default 0;
declare checksum int default 0;
declare d int default 0;
declare parity int default 0;
set checksum = qusrsys.modulus10( inString concat '0');
if checksum = 0 then
return 0;
else
return 10 - checksum;
end if;
end;
create or replace function qusrsys.modulus10validate (inString varchar(32))
returns int
language sql
reads sql data
returns null on null input
no external action
deterministic
set option dbgview = *source , output=*print
begin atomic
declare len int default 0;
declare checksum int default 0;
declare d int default 0;
declare parity int default 0;
set checksum = qusrsys.modulus10( inString);
if checksum = 0 then
return 1;
else
return 0;
end if;
end;
-- This returns 0
values (
qusrsys.modulus10('8527530000345267')
);
-- This returns 7
values (
qusrsys.modulus10calculate('852753000034526')
);
-- This returns 1
values (
qusrsys.modulus10validate('8527530000345267')
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment