MS Access 2007 SQL中如何在LIKE通配符中使用非单字符列表实现DRY代码?
解决Access 2007 SQL中多LIKE OR的DRY优化问题
嘿,我完全懂你想把重复的LIKE OR语句简化成更DRY(Don't Repeat Yourself)写法的需求,但Access的通配符[]确实只能匹配单个字符,所以你的尝试会把11这类多数字符串拆成两个单独的1处理,这就导致了不符合预期的结果。别担心,不用VBA也有几种靠谱的解决办法:
方法一:使用INSTR+分隔字符串匹配完整值
这种方法通过给目标值和ID都加上统一的分隔符,确保我们匹配的是完整的目标字符串,不会被拆分成单个字符:
SELECT * FROM Student_Enrollment WHERE INSTR('|2|5|8|17|14|11|21|', '|' & ID & '|') > 0
注意:请确保你选用的分隔符(这里用了|)不会出现在ID字段的内容里,如果有冲突,可以换成其他符号比如#或者^。
方法二:用子查询生成目标列表,通过JOIN匹配
这种方法可读性更强,把所有要匹配的目标值整理成一个临时子查询,再通过JOIN关联主表:
SELECT se.* FROM Student_Enrollment se INNER JOIN ( SELECT '2' AS TargetID UNION ALL SELECT '5' UNION ALL SELECT '8' UNION ALL SELECT '17' UNION ALL SELECT '14' UNION ALL SELECT '11' UNION ALL SELECT '21' ) AS Targets ON se.ID LIKE '*' & Targets.TargetID & '*'
后续如果需要添加或删除目标值,只需要修改子查询里的UNION ALL部分就行,比一堆OR语句好维护太多。
这两种方法都完全不需要VBA,完美实现了你想要的DRY风格,而且能准确匹配你需要的目标ID。
内容的提问来源于stack exchange,提问作者rita pinhasov




