如何修复SQL语法错误,实现支持空格的跨列搜索功能?
修复带空格搜索的SQL语法错误方案
问题出在哪
你原来的SQL里keywords[ ]+location_keywords是错误写法:
- SQL里不能用
[ ]表示空格,直接写空格就行 - 字符串拼接不能这么用
+,得用对应数据库的拼接方法
分数据库的正确写法
MySQL/MariaDB 版本
用CONCAT函数拼接两列,同时兼顾单个关键词和组合词的匹配:
SELECT * FROM `partners` WHERE -- 匹配单个关键词(Townsville或marketing) location_keywords LIKE '%Townsville%' OR location_keywords LIKE '%marketing%' OR keywords LIKE '%Townsville%' OR keywords LIKE '%marketing%' -- 匹配"Townsville marketing"(location在前,keywords在后) OR CONCAT(location_keywords, ' ', keywords) LIKE '%Townsville marketing%' -- 匹配"marketing Townsville"(keywords在前,location在后) OR CONCAT(keywords, ' ', location_keywords) LIKE '%Townsville marketing%';
如果是动态用户输入,先把搜索词按空格拆成单个词,再用参数化查询(避免SQL注入):
-- 假设?是参数占位符,依次传入拆分后的单个词、完整搜索词 SELECT * FROM `partners` WHERE location_keywords LIKE CONCAT('%', ?, '%') OR location_keywords LIKE CONCAT('%', ?, '%') OR keywords LIKE CONCAT('%', ?, '%') OR keywords LIKE CONCAT('%', ?, '%') OR CONCAT(location_keywords, ' ', keywords) LIKE CONCAT('%', ?, '%') OR CONCAT(keywords, ' ', location_keywords) LIKE CONCAT('%', ?, '%');
PostgreSQL 版本
PostgreSQL用||做字符串拼接:
SELECT * FROM partners WHERE location_keywords LIKE '%Townsville%' OR location_keywords LIKE '%marketing%' OR keywords LIKE '%Townsville%' OR keywords LIKE '%marketing%' OR (location_keywords || ' ' || keywords) LIKE '%Townsville marketing%' OR (keywords || ' ' || location_keywords) LIKE '%Townsville marketing%';
SQL Server 版本
SQL Server可用+拼接,但要处理NULL值(用ISNULL避免拼接结果为NULL):
SELECT * FROM partners WHERE location_keywords LIKE '%Townsville%' OR location_keywords LIKE '%marketing%' OR keywords LIKE '%Townsville%' OR keywords LIKE '%marketing%' OR (ISNULL(location_keywords, '') + ' ' + ISNULL(keywords, '')) LIKE '%Townsville marketing%' OR (ISNULL(keywords, '') + ' ' + ISNULL(location_keywords, '')) LIKE '%Townsville marketing%';
额外提醒
- 绝对不要直接把用户输入拼进SQL,用参数化查询防注入
- 如果数据量很大,
LIKE '%xxx%'会很慢,建议用全文索引优化搜索性能
内容的提问来源于stack exchange,提问作者Travis
相关产品推荐
相关产品推荐

