2015-02-16 2 views
1

Снятие последней цифры строки и ее изменение ... они немного отличаются от Postgres до Oracle, но легко выполняются.Может ли Luhn (хеширование номера кредитной карты) быть реализовано без внешних/пользовательских функций в Postgres?

фрагмент Этот запрос находится примерно на полпути там:

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) 

Если я могу придумать e sum, то это всего лишь check (n%10 = right('6011406981867628',1)), и я закончил.

Можно ли сделать сумму() на них?

+0

Mod 10 служит _no purpose_, кроме как для проверки опечаток - он должен быть реализован как можно ближе к слою презентации. Почему вы используете его в качестве контрольного ограничения? –

+0

Я не согласен. Если бы мне захотелось идеи полуразмерной базы данных, я бы использовал Монго. Возможно, мое приложение не будет единственным, кто будет напрямую обращаться к базе данных, и что бы еще ни было, он сможет вставлять плохие данные. Все взрывается. Есть причина, по которой Postgres реализовывали ограничения (что забавно связано с тем, почему MySQL не так долго ... это разумная вещь). В любом случае, я никогда не буду лично хранить номера кредитных карт в любом из моих материалов ... работая над модом для Sequelize, который также ставит валидаторы в бэкэнд. Поэтому я не могу просто создать функцию для обработки этого. –

+0

Не поймите меня неправильно, ограничения важны. Это * это * особое ограничение, которое беспокоит меня, потому что оно ничего не доказывает. Номера кредитных карт не могут быть известны _valid_ до тех пор, пока они не будут запущены через сеть обработки платежей, а карты _good_ являются небольшим подмножеством _valid_ ответов. –

ответ

1

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) 
+0

Или под «пользовательской функцией» вы хотите избежать «CREATE_FUNCTION»? Извините, не ясно мне. Вы можете просто вставить эти определения. –

+0

Да, я не могу создать функцию для этого. Встроенные модули в порядке. –

+0

И в этом отношении я не могу использовать подзапрос, это должно быть простое выражение или ограничение проверки будет перекрываться. –

Смежные вопросы