如何比较同一数据表中NUMBER与OLD_NUMBER列的匹配数据
逐行匹配NUMBER与OLD_NUMBER逗号分隔值的实现方案
核心逻辑
逐行遍历数据,判断当前行的NUMBER字段值是否存在于本行OLD_NUMBER字段存储的逗号分隔值集合中,命中的行直接返回。
参考表样本
题目给出的INSURANCE表测试数据:
ID NAME NUMBER OLD_NUMBER 1 STEVE 55 11,22,44 2 JOHN 77 33,66,77 3 PETER 99 88,99
各数据库可直接运行的SQL
- MySQL 实现
通过前后补全逗号的方式规避边界误判,搭配INSTR函数做值定位:
SELECT * FROM INSURANCE WHERE INSTR(CONCAT(',', OLD_NUMBER, ','), CONCAT(',', NUMBER, ',')) > 0;
执行后会返回匹配成功的第2、3行,第1行因为55不在OLD_NUMBER的分隔值集合中被过滤。
- PostgreSQL 实现
利用内置的字符串拆分能力,把OLD_NUMBER拆为数组后直接判断值是否在集合内:
SELECT * FROM INSURANCE WHERE NUMBER = ANY(string_to_array(OLD_NUMBER, ',')::integer[]);
- Oracle 实现
适配Oracle的字符串拼接语法,同样采用补全逗号的判断逻辑:
SELECT * FROM INSURANCE WHERE INSTR(',' || OLD_NUMBER || ',', ',' || NUMBER || ',') > 0;
常见坑点提醒
不要直接用OLD_NUMBER LIKE '%NUMBER值%'的模糊匹配写法,这类写法存在严重的边界误判问题:比如当NUMBER为9时,只要OLD_NUMBER里包含99、19、91这类带9的子串,就会被错误命中。给OLD_NUMBER前后统一拼接逗号后再做匹配,可以从根源上解决这类误判问题。
内容的提问来源于stack exchange,提问作者Morroc's Thief
相关产品推荐
相关产品推荐

