Luhn(信用卡号哈希)可以在Postgres中在没有外部/自定义功能的情况下实现吗



去掉字符串的最后一位并将其反转……从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)

最新更新