SQL中是否存在类数组功能实现LIKE多值模糊匹配?
SQL批量前缀LIKE匹配实现方案
完全可以实现,不需要编写多个OR连接的条件,也不需要逐个宏录入匹配值,主流数据库都支持这类批量匹配逻辑,常用实现方式如下:
正则匹配方案(全引擎通用,代码量最少)
核心逻辑是把逗号分隔的前缀列表转换为正则前缀匹配规则,只需要把用户输入的逗号替换为|,拼接为^(值1|值2|值3)的正则格式即可,直接完成所有前缀的匹配。
示例:查找以F/E/C开头的员工编号,对应查询写法:-- MySQL 8.0+/PostgreSQL/Oracle 适用 SELECT * FROM employee WHERE emp_no REGEXP '^(F|E|C)';如果是多字符前缀场景,比如匹配
aa/bbb/c/dfd开头的值,只需要把正则部分调整为'^(aa|bbb|c|dfd)'即可,全程不需要手写多个LIKE + OR的组合。注意:如果前缀中包含正则元字符(如
.、*、+等),需要先对特殊字符做转义处理,避免匹配逻辑出错。数组/字符串拆分匹配方案(无转义成本,兼容性强)
支持数组类型或字符串拆分函数的数据库,可以直接把传入的逗号分隔字符串拆分为前缀集合,通过关联匹配完成查询,逻辑和手写OR完全一致,还能正常用上字段的前缀索引:- PostgreSQL (原生数组支持)
SELECT * FROM employee WHERE EXISTS ( SELECT 1 FROM unnest(ARRAY['F','E','C']) AS prefix WHERE emp_no LIKE prefix || '%' );- SQL Server/MySQL 8.0+ (字符串拆分函数)
-- SQL Server 写法 SELECT DISTINCT e.* FROM employee e INNER JOIN STRING_SPLIT('F,E,C', ',') s ON e.emp_no LIKE s.value + '%';这类方案只需要把用户输入的整段逗号分隔字符串作为参数传入即可,不需要额外拆分录入,也不用拼接多个OR条件。
两种方案的查询性能和手写多个OR条件基本一致,只要员工编号字段建了普通B树索引,都可以命中前缀匹配的索引规则,不会出现全表扫描的性能问题。
内容的提问来源于stack exchange,提问作者mattyt81
相关产品推荐
相关产品推荐

