如何在SQL多列中对字符串值执行LIKE模糊匹配查询?
多列LIKE OR匹配优化方案
通用跨数据库方案(拼接匹配法)
直接将需要匹配的多列用特殊分隔符拼接后做一次模糊匹配,不需要逐个写OR条件,注意做空值处理和加分隔符避免跨列误匹配:
-- 用COALESCE处理空值,| 作为分隔符避免跨列拼接误命中 SELECT * FROM table WHERE CONCAT_WS('|', COALESCE(col0,''), COALESCE(col1,''), COALESCE(col2,''), ...) LIKE '%value%';
注意:CONCAT_WS是大部分主流数据库(MySQL、PostgreSQL、SQL Server 2017+)都支持的拼接函数,更低版本的SQL Server可以用
+或者CONCAT函数替代。
不同数据库专属更优写法
- PostgreSQL 方案:利用数组遍历匹配,完全避免拼接误判问题
SELECT * FROM table WHERE EXISTS ( SELECT 1 FROM unnest(ARRAY[col0,col1,col2,...]) AS t(col_val) WHERE col_val LIKE '%value%' );
- MySQL 方案:利用JSON_SEARCH函数实现多值匹配
SELECT * FROM table WHERE JSON_SEARCH(JSON_ARRAY(col0,col1,col2,...), 'one', '%value%') IS NOT NULL;
大数量场景最优方案(全文索引)
如果需要高频执行这类多列模糊搜索,建议针对需要匹配的列建立全文索引,性能远高于普通LIKE查询:
-- 以MySQL为例,先建全文索引 ALTER TABLE table ADD FULLTEXT INDEX ft_idx_cols(col0,col1,col2,...); -- 查询语句 SELECT * FROM table WHERE MATCH(col0,col1,col2,...) AGAINST('value' IN BOOLEAN MODE);
注意事项
- 普通
%value%格式的LIKE查询无法用到普通B树索引,数据量超过10万级时查询延迟会明显升高,优先选择全文索引方案。 - 拼接列时必须加业务中不会出现的特殊字符作为分隔符,避免col0结尾和col1开头拼接后刚好命中搜索词的误匹配问题。
- 可空列必须先做COALESCE处理为空字符串,否则空值参与拼接会导致整个拼接结果为NULL,出现漏匹配。
内容的提问来源于stack exchange,提问作者Patrick Kaim
相关产品推荐
相关产品推荐

