1

剥离字符串的最后一位并将其反转......这些从 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() ?

4

1 回答 1

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)
于 2015-02-16T22:39:18.587 回答