Снятие последней цифры строки и ее изменение ... они немного отличаются от 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))
, и я закончил.
Можно ли сделать сумму() на них?
Mod 10 служит _no purpose_, кроме как для проверки опечаток - он должен быть реализован как можно ближе к слою презентации. Почему вы используете его в качестве контрольного ограничения? –
Я не согласен. Если бы мне захотелось идеи полуразмерной базы данных, я бы использовал Монго. Возможно, мое приложение не будет единственным, кто будет напрямую обращаться к базе данных, и что бы еще ни было, он сможет вставлять плохие данные. Все взрывается. Есть причина, по которой Postgres реализовывали ограничения (что забавно связано с тем, почему MySQL не так долго ... это разумная вещь). В любом случае, я никогда не буду лично хранить номера кредитных карт в любом из моих материалов ... работая над модом для Sequelize, который также ставит валидаторы в бэкэнд. Поэтому я не могу просто создать функцию для обработки этого. –
Не поймите меня неправильно, ограничения важны. Это * это * особое ограничение, которое беспокоит меня, потому что оно ничего не доказывает. Номера кредитных карт не могут быть известны _valid_ до тех пор, пока они не будут запущены через сеть обработки платежей, а карты _good_ являются небольшим подмножеством _valid_ ответов. –