信用卡号掩码处理技术咨询:16位卡号首尾掩码实现方案
信用卡卡号掩码实现方案可行性验证
我有一批16位信用卡卡号,需要对卡号前4位和后6位之外的部分做掩码处理。现在有一段CASE语句代码,想请大家验证这个方案是否可行:
CASE(target_number WHEN "C~" THEN(LEFT(target_number, 4) + IF(LEN(TRIM(target_number)) > 4, "*******~", "~") + CASE(LEN(TRIM(target_number)) WHEN IS > 15 THEN RIGHT(TRIM(target_number), 6) WHEN IS = 15 THEN RIGHT(TRIM(target_number), 5) WHEN IS = 14 THEN RIGHT(TRIM(target_number), 4) ELSE "~")) ELSE target_number)
原方案不可行,存在以下问题
- 语法错误:内层CASE的
WHEN IS > 15写法无效,SQL中没有这种语法,正确写法应该是WHEN LEN(TRIM(target_number)) > 15,多余的IS会直接导致语句执行失败。 - 逻辑判断失效:外层CASE的
target_number WHEN "C~"是直接比较卡号是否等于字符串"C~",根本匹配不了真实的长卡号,掩码逻辑完全不会触发。 - 掩码长度错误:16位卡号的中间掩码应该是6个字符(16-4-6=6),但代码里固定写了
*******~(7个*加~),会让最终卡号长度异常、格式混乱。 - 多余符号干扰:代码中多处拼接
~符号,会让掩码后的卡号出现无关字符,不符合1234******123456这类常规格式。 - 冗余逻辑偏离需求:需求明确是处理16位卡号,但代码额外处理14、15位的情况,不仅多余,还可能引入不必要的错误。
修正后的可行示例
假设卡号前缀为C~(可根据实际调整判断条件),正确的掩码实现代码如下:
CASE WHEN target_number LIKE 'C~%' -- 匹配带指定前缀的信用卡卡号 THEN LEFT(TRIM(target_number), 4) + REPLICATE('*', LEN(TRIM(target_number)) - 10) -- 动态计算中间掩码长度(总长度-4-6) + RIGHT(TRIM(target_number), 6) ELSE target_number END
内容的提问来源于stack exchange,提问作者Nguyễn Quang Huy
相关产品推荐
相关产品推荐

