MySQL中如何从末尾反向匹配长度不定的逗号分隔数字字符串
逗号分隔数字序列反向后缀匹配方案
核心规则
- 待匹配序列:固定长度20位,由0、1、2三种数字组成,格式为逗号分隔的字符串
- 数据库存储序列:与待匹配序列格式一致,长度不固定
- 匹配逻辑:从字符串末尾向前做反向完全匹配,即库中存储的序列,必须和待匹配序列末尾等长度的片段完全一致,才算匹配成功
匹配示例
待匹配20位序列:
'1,1,2,1,2,1,0,1,2,1,2,1,0,1,2,1,1,1,2,1'库中存储序列清单:
- 编号1:
'1,1,2,1'- 编号2:
'2,1,2,2,2,2'- 编号3:
'2,1'- 编号4:
'1,1,2,1,2,1'预期匹配结果:仅返回编号为1、3的记录
实现参考(以MySQL场景为例)
核心思路是直接取待匹配序列末尾、与库中序列等长的子串做等值判断,不需要拆分字符串,执行效率高:
-- 预先将待匹配的20位序列赋值给变量 SET @target_seq = '1,1,2,1,2,1,0,1,2,1,2,1,0,1,2,1,1,1,2,1'; -- 查询匹配的记录 SELECT id, stored_seq FROM sequence_lib WHERE RIGHT(@target_seq, CHAR_LENGTH(stored_seq)) = stored_seq;
注:该判断逻辑不会出现截断半段数字/逗号的误判:如果截取位置刚好落在元素中间,截取到的子串开头或结尾会出现多余逗号,和格式合法的库中序列不可能相等,无需额外做元素拆分校验。
示例匹配校验
- 编号1的序列长度为7个字符(4个数字+3个逗号),待匹配序列末尾7个字符为
1,1,2,1,完全相等,匹配成功 - 编号2的序列长度为11个字符(6个数字+5个逗号),待匹配序列末尾11个字符为
2,1,1,1,2,1,与存储序列不一致,匹配失败 - 编号3的序列长度为3个字符(2个数字+1个逗号),待匹配序列末尾3个字符为
2,1,完全相等,匹配成功 - 编号4的序列长度为11个字符(6个数字+5个逗号),待匹配序列末尾11个字符为
2,1,1,1,2,1,与存储序列不一致,匹配失败
内容的提问来源于stack exchange,提问作者gustavo martins
相关产品推荐
相关产品推荐

