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

标签 sql postgresql check-constraints luhn

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

相关文章:

sql - 如何创建一个简洁的 SQL 'Check Constraint',禁止所有字符串字段使用某些字符?

SQL CHECK 约束问题

mysql - 哪种数据库和哪种索引最适合这种情况?

Postgresql:日期格式和本地语言输出

oracle 11g中的SQL语句

mysql - SQL 中 ifnull() 的混淆行为

postgresql - 如何使用 ServiceStack OrmLite 从插入返回标识值 - PostgreSQL

sql - 检查约束中的子查询

php - 将代码片段插入数据库并在文本区域中以相同方式显示

sql - 断开 dplyr 中的 src_tbls 连接