CodeIgniter如何实现两个字段拼接后执行LIKE匹配查询?
实现方案说明
你可以通过拼接字段后匹配的方式实现需求,不同数据库的拼接语法略有差异,具体实现如下:
通用基础写法
在原有查询条件基础上新增拼接字段匹配逻辑即可,兼容绝大多数主流数据库:
WHERE -- 保留原有单字段匹配逻辑,不影响旧搜索场景 t.name LIKE ? OR t.keywords LIKE ? OR t.version LIKE ? -- 新增name+version拼接匹配逻辑 OR CONCAT(t.name, ' ', t.version) LIKE ?
如果搜索关键词存在中间多空格的情况,可以嵌套REPLACE函数把连续空格替换为单个空格后再匹配,避免格式差异导致匹配失败。
不同数据库的适配写法
如果不需要跨数据库兼容,可以用对应数据库的原生拼接语法简化写法:
- MySQL/MariaDB:开启
sql_mode=PIPES_AS_CONCAT后可以用||运算符:t.name || ' ' || t.version LIKE ? - Oracle:原生支持
||运算符:t.name || ' ' || t.version LIKE ? - PostgreSQL:可以用
CONCAT_WS函数自动处理空值异常:CONCAT_WS(' ', t.name, t.version) LIKE ? - SQL Server:可以直接用
+运算符拼接:t.name + ' ' + t.version LIKE ?
入参与性能说明
- 入参绑定时,原有三个占位符依旧传入加了前后
%的全量搜索词,新增的拼接匹配占位符同样传入加了前后%的全量搜索词即可,不需要拆分关键词。如果需要完全精确匹配拼接值,去掉%即可。 - 如果数据量较大,可以新增预计算存储
name + ' ' + version值的计算列并建立索引,或者替换为全文索引,避免拼接查询无法命中原有单字段索引导致性能下降。
内容的提问来源于stack exchange,提问作者Kadour H. Kadour
相关产品推荐
相关产品推荐

