MySQL如何按指定长度规则对银行卡号做掩码处理并返回格式化结果
银行卡号格式化SELECT查询实现方案
以下是适配主流数据库的实现代码,核心逻辑为通过CASE WHEN判断卡号长度后,拼接固定格式掩码+真实后四位卡号,逻辑简单且性能优秀:
MySQL 版本
SELECT CASE WHEN LENGTH(TRIM(CAST(card_no AS CHAR))) = 16 THEN CONCAT('XXXX-XXXX-XXXX-', RIGHT(card_no, 4)) WHEN LENGTH(TRIM(CAST(card_no AS CHAR))) = 15 THEN CONCAT('XXXX-XXXXXX-X', RIGHT(card_no, 4)) -- 非15/16位的非标准卡号可根据业务需求调整返回逻辑,比如返回原值、空值或者非法标识 ELSE card_no END AS formatted_card_no FROM 你的表名;
PostgreSQL 版本
SELECT CASE WHEN LENGTH(TRIM(card_no::VARCHAR)) = 16 THEN 'XXXX-XXXX-XXXX-' || RIGHT(card_no, 4) WHEN LENGTH(TRIM(card_no::VARCHAR)) = 15 THEN 'XXXX-XXXXXX-X' || RIGHT(card_no, 4) ELSE card_no END AS formatted_card_no FROM 你的表名;
SQL Server 版本
SELECT CASE WHEN LEN(TRIM(CAST(card_no AS VARCHAR))) = 16 THEN 'XXXX-XXXX-XXXX-' + RIGHT(card_no, 4) WHEN LEN(TRIM(CAST(card_no AS VARCHAR))) = 15 THEN 'XXXX-XXXXXX-X' + RIGHT(card_no, 4) ELSE card_no END AS formatted_card_no FROM 你的表名;
注意事项
- 如果卡号存储时夹杂空格、特殊符号,可先通过正则清洗函数去除非数字字符后再做长度判断,避免逻辑出错
- 若业务需要展示前几位BIN码,仅需将对应位置的
X替换为LEFT函数截取的真实卡号前缀即可 - 数值类型存储的卡号必须先转为字符串类型再处理,避免长度计算、RIGHT函数取值异常
内容的提问来源于stack exchange,提问作者Minnie
相关产品推荐
相关产品推荐

