MySQL使用LIKE查询时如何仅返回匹配到的完整子串
MySQL LIKE查询返回匹配完整子串的实现方法
实现方案
方案1:MySQL 8.0及以上版本(推荐)
直接使用内置的REGEXP_SUBSTR正则提取函数,即可精准提取包含目标子串的完整单词:
SELECT REGEXP_SUBSTR(`title`, '[[:alpha:]]*inno[[:alpha:]]*', 1, 1, 'i') AS matched_substr FROM `search_index` WHERE `title` LIKE '%inno%';
参数说明:
[[:alpha:]]*inno[[:alpha:]]*:匹配所有包含inno、前后拼接任意数量字母的连续字符串,也就是完整的英文单词- 最后一位参数
'i':表示不区分大小写,可同时匹配inno、Inno、INNO等格式 - 如果需要严格限定单词边界(避免匹配到无意义拼接串如
xxinnoxx),可以将正则替换为'[[:<:]][[:alpha:]]*inno[[:alpha:]]*[[:>:]]',[[:<:]]和[[:>:]]为MySQL内置的单词起止标识符 - 如果单词允许包含数字,可将
[[:alpha:]]替换为[[:alnum:]]
方案2:MySQL 5.x低版本适配
低版本MySQL没有内置正则提取函数,可以通过字符串定位+截取的组合逻辑实现:
SELECT SUBSTRING( `title`, IF(LOCATE(' ', `title`, LOCATE('inno', LOWER(`title`)) - LENGTH(`title`)) = 0, 1, LOCATE(' ', `title`, LOCATE('inno', LOWER(`title`)) - LENGTH(`title`)) + 1), IF(LOCATE(' ', `title`, LOCATE('inno', LOWER(`title`))) = 0, LENGTH(`title`), LOCATE(' ', `title`, LOCATE('inno', LOWER(`title`)))) - IF(LOCATE(' ', `title`, LOCATE('inno', LOWER(`title`)) - LENGTH(`title`)) = 0, 1, LOCATE(' ', `title`, LOCATE('inno', LOWER(`title`)) - LENGTH(`title`)) + 1) ) AS matched_substr FROM `search_index` WHERE `title` LIKE '%inno%';
该方案仅适配单词以空格作为分隔符的场景,不支持标点等其他分隔符,仅建议低版本临时使用。
内容的提问来源于stack exchange,提问作者deroccha
相关产品推荐
相关产品推荐

