剥离字符串的最后一位并将其反转......这些从 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))
就可以了。
是否可以对这些进行 sum()?
最佳答案
Can Luhn (credit card number hashing) be implemented without external/custom functions in Postgres?
是的,它可以,如此处记录: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)
关于sql - Luhn(信用卡号哈希)可以在没有外部/自定义功能的情况下在 Postgres 中实现吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28551390/