You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL中如何查询字符串任意单词是否存在于逗号分隔列中

解决方案

这里提供两种更优雅的单条查询方案,替代多个OR拼接FIND_IN_SET的写法:

方案一:使用正则表达式(REGEXP)

利用MySQL的正则匹配功能,把目标字符串的空格替换为正则分支符|,同时为每个单词添加逗号匹配规则,确保匹配的是keywords列中完整的分隔单词:

SELECT * FROM products 
WHERE keywords REGEXP CONCAT('(^|,)', REPLACE('I need red budget car', ' ', '(,|$)|(^|,)'), '(,|$)');

原理说明:

  • REPLACE('I need red budget car', ' ', '(,|$)|(^|,)')会把空格分隔的单词转换为I(,|$)|(^|,)need(,|$)|(^|,)red(,|$)|(^|,)budget(,|$)|(^|,)car
  • 前后拼接(^|,)和(,|$),确保匹配的是keywords列中以逗号分隔的完整单词(比如不会把"redcar"误判为包含"red")

方案二:使用CTE+字符串拆分(MySQL 8.0+)

如果你的MySQL版本是8.0及以上,可以用STRING_SPLIT拆分目标字符串为独立单词,再通过JOIN关联匹配:

WITH query_words AS (
    SELECT TRIM(word) AS word
    FROM STRING_SPLIT('I need red budget car', ' ')
)
SELECT DISTINCT p.*
FROM products p
JOIN query_words w ON FIND_IN_SET(w.word, p.keywords) > 0;

这个方案逻辑更清晰,当目标字符串的单词数量较多时,SQL代码不会变得冗长,易维护。

方案对比

  • 正则方案:兼容低版本MySQL,但单词过多时正则表达式会很长,可读性下降
  • CTE拆分方案:代码结构清晰,适合单词数量多的场景,但要求MySQL 8.0及以上版本

内容的提问来源于stack exchange,提问作者lStoilov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 13:59:08