基于掩码生成银行账号字符串的SQL实现求助
基于掩码替换生成目标银行账号字符串
给定26位银行账号:38116022445159832409307409,以及7个匹配掩码(匹配规则为账号与掩码的第3-10位完全一致),需将掩码中的所有Y替换为账号对应位置的数字,X和固定数字保持不变,生成目标字符串。
掩码列表
XX11602244YYYXXXXXXXXXXXXX XX11602244YYYYXXXXXXXXXXXX XX11602244YYYYXXXXXYYXXXXX XX11602244YYYYYXXXXXXXXXXX XX11602244YYYYYYXXXXXXXXXX XX11602244YYYYYYYXXXXXXXXX XX11602244YYYYYYYXXXXXXXYY
解决方案(SQL实现)
通过逐字符遍历掩码,判断每个位置是否为Y,若是则替换为账号对应位置的数字,否则保留原字符。以下是具体实现代码:
DECLARE @Account VARCHAR(26) = '38116022445159832409307409'; -- 创建临时掩码表 CREATE TABLE #Masks (Mask VARCHAR(26)); INSERT INTO #Masks (Mask) VALUES ('XX11602244YYYXXXXXXXXXXXXX'), ('XX11602244YYYYXXXXXXXXXXXX'), ('XX11602244YYYYXXXXXYYXXXXX'), ('XX11602244YYYYYXXXXXXXXXXX'), ('XX11602244YYYYYYXXXXXXXXXX'), ('XX11602244YYYYYYYXXXXXXXXX'), ('XX11602244YYYYYYYXXXXXXXYY'); -- 生成1到26的数字序列,用于遍历每个字符位置 WITH Numbers AS ( SELECT 1 AS N UNION ALL SELECT N + 1 FROM Numbers WHERE N < 26 ) -- 处理每个掩码并生成目标字符串 SELECT CONCAT(m.Mask, ' -> ', ( SELECT CASE SUBSTRING(m.Mask, n.N, 1) WHEN 'Y' THEN SUBSTRING(@Account, n.N, 1) ELSE SUBSTRING(m.Mask, n.N, 1) END FROM Numbers n ORDER BY n.N FOR XML PATH(''), TYPE ).value('.', 'VARCHAR(26)') ) AS Result FROM #Masks m; DROP TABLE #Masks;
输出结果
执行上述代码后,将得到符合要求的输出:
XX11602244YYYXXXXXXXXXXXXX -> XX11602244515XXXXXXXXXXXXX XX11602244YYYYXXXXXXXXXXXX -> XX116022445159XXXXXXXXXXXX XX11602244YYYYXXXXXYYXXXXX -> XX11602244515XXXXXX93XXXXX XX11602244YYYYYXXXXXXXXXXX -> XX1160224451598XXXXXXXXXXX XX11602244YYYYYYXXXXXXXXXX -> XX11602244515983XXXXXXXXXX XX11602244YYYYYYYXXXXXXXXX -> XX116022445159832XXXXXXXXX XX11602244YYYYYYYXXXXXXXYY -> XX116022445159832XXXXXXX09
方案说明
- 该方案通过生成数字序列遍历掩码的每一个字符位置,无需依赖
PATINDEX,能处理Y出现在任意位置(除第3-10位,根据匹配规则此处无Y)的场景。 - 逻辑简单直接,适配X与Y总数不超过18的限制,避免了通用方案不适配此场景的问题。
内容的提问来源于stack exchange,提问作者Paksos
相关产品推荐
相关产品推荐

