可以在Postgres中实现Luhn(信用卡号码哈希)而无需外部/自定义功能吗?

时间:2015-02-16 22:20:34

标签: sql postgresql check-constraints luhn

剥离字符串的最后一位并将其反转......这些从Postgres到Oracle有点不同,但很容易实现。

这个查询片段大概就在那里:

select translate(reverse(left('6011406981867628',-1)), '13579', '26159');
-- 6011406981867628 is a fake credit card number for test purposes.

唯一剩下的就是对所有数字求和,然后对其进行修改10。但是,当我尝试使用:

select sum(regexp_split_to_table(translate(reverse(left('6011406981867628',-1)), '13579', '26159'), E'\\s*')::integer);

我收到以下错误:

ERROR:  set-valued function called in context that cannot accept a set

请注意,如果我删除总和,那么:

select regexp_split_to_table(translate(reverse(left('6011406981867628',-1)), '13579', '26159'), E'\\s*')::integer;

我会得到这个:

regexp_split_to_table 
-----------------------
                 2
                 6
                 5
                 6
                 8
                 2
                 8
                 9
                 6
                 0
                 4
                 2
                 2
                 0
                 6
(15 rows)

如果我能拿出总和,那么它只是check (n%10 = right('6011406981867628',1))而且我已经完成了。

是否可以对这些进行总和()?

1 个答案:

答案 0 :(得分:2)

  

可以在Postgres中使用Luhn(信用卡号码哈希)而无需外部/自定义功能吗?

是的,它可以,如此处所述:https://wiki.postgresql.org/wiki/Luhn_algorithm

要解决围绕SUM的具体问题,您要给它错误的参数类型。您可以使用子查询来执行此操作:

# select SUM(regexp_split_to_table) from (select regexp_split_to_table(translate(reverse(left('6011406981867628',-1)), '13579', '26159'), E'\\s*')::integer) a;
 sum
-----
  66
(1 row)