MySQL如何提取字符串或VARCHAR字段中的前1、2、3个单词
解决MySQL中提取指定位置单词的需求
嘿,作为天天跟MySQL打交道的老鸟,这两个提取单词的需求其实用内置函数就能轻松搞定,核心就是靠SUBSTRING_INDEX这个处理分隔符字符串的神器,咱们直接上实用方案:
一、从VARCHAR字段提取第1、第2、第3个单词
假设你的目标字段名为text_content,表名为your_table,单词之间用空格分隔(如果是逗号、竖线这类其他分隔符,把下面的空格换成对应符号就行)。
提取第1个单词
SUBSTRING_INDEX会从左往右匹配第一个分隔符,直接截取前面的内容:
SELECT SUBSTRING_INDEX(text_content, ' ', 1) AS first_word FROM your_table;
提取第2个单词
先截取前两个单词的整体,再去掉第一个单词,就能拿到第二个:
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(text_content, ' ', 2), ' ', -1) AS second_word FROM your_table;
提取第3个单词
逻辑和提取第二个一致,先取前三个单词的整体,再剔除前两个:
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(text_content, ' ', 3), ' ', -1) AS third_word FROM your_table;
处理单词不足的情况
如果部分记录的单词数量少于3个,上面的语句会返回最后一个存在的单词。要是你想让不足的位置返回NULL或者空字符串,可以加个判断逻辑:
SELECT SUBSTRING_INDEX(text_content, ' ', 1) AS first_word, CASE WHEN LENGTH(text_content) - LENGTH(REPLACE(text_content, ' ', '')) >= 1 THEN SUBSTRING_INDEX(SUBSTRING_INDEX(text_content, ' ', 2), ' ', -1) ELSE NULL END AS second_word, CASE WHEN LENGTH(text_content) - LENGTH(REPLACE(text_content, ' ', '')) >= 2 THEN SUBSTRING_INDEX(SUBSTRING_INDEX(text_content, ' ', 3), ' ', -1) ELSE NULL END AS third_word FROM your_table;
这里通过计算空格数量(空格数+1就是单词总数)来判断对应位置的单词是否存在,灵活度拉满。
二、从VARCHAR字段提取第1、第2个单词
这个是上面需求的简化版,除了单独提取,还能直接把两个单词拼接成一个字符串返回:
分别提取第1、第2个单词
SELECT SUBSTRING_INDEX(text_content, ' ', 1) AS first_word, CASE WHEN LENGTH(text_content) - LENGTH(REPLACE(text_content, ' ', '')) >= 1 THEN SUBSTRING_INDEX(SUBSTRING_INDEX(text_content, ' ', 2), ' ', -1) ELSE NULL END AS second_word FROM your_table;
提取并拼接前两个单词
如果需要把前两个单词合并成一个字段返回:
SELECT CASE WHEN LENGTH(text_content) - LENGTH(REPLACE(text_content, ' ', '')) >= 1 THEN CONCAT(SUBSTRING_INDEX(text_content, ' ', 1), ' ', SUBSTRING_INDEX(SUBSTRING_INDEX(text_content, ' ', 2), ' ', -1)) ELSE SUBSTRING_INDEX(text_content, ' ', 1) END AS first_two_words FROM your_table;
内容的提问来源于stack exchange,提问作者Revious
相关产品推荐
相关产品推荐

