去掉字符串的最后一位并将其反转……从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()运算吗?
Luhn(信用卡号哈希)可以在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)