如何基于逗号分隔值列表构建带LIKE匹配的SQL WHERE子句
实现方案
不需要手动拼接多个OR条件,直接通过EXISTS关联STRING_SPLIT拆分后的参数值做前缀匹配即可,逻辑和你需要的多OR LIKE效果完全等价,同时避免了动态SQL带来的SQL注入风险。
核心实现代码如下:
SELECT * FROM users u WHERE EXISTS ( SELECT 1 FROM STRING_SPLIT(@userList, ',') s WHERE u.username LIKE TRIM(s.value) + '%' )
注意事项
- 代码中对拆分出的参数值加了
TRIM()处理,是为了兼容传参时逗号前后带多余空格的场景,比如入参写为'value1, value2,value3'时,不会因为值前后的空格导致匹配失效。 - 该写法属于标准前缀匹配(通配符
%仅在匹配串末尾),如果username字段建有索引,查询可以正常命中索引,性能表现和手写多个OR条件一致。 - 不要直接用
INNER JOIN关联拆分结果:如果某个用户名同时匹配多个入参前缀(比如入参为'ad,adm',用户名为admin时会同时命中两个匹配规则),JOIN写法会返回重复的用户行,必须额外加DISTINCT去重,会带来不必要的性能开销,EXISTS的写法天生不存在重复返回的问题。
内容的提问来源于stack exchange,提问作者Brian Kalski
相关产品推荐
相关产品推荐

