剥离字符串的最后一位并将其反转......这些从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))
而且我已经完成了。
是否可以对这些进行总和()?
答案 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)