如何用MySQL查询将数据库列中的Title Case格式文本转换为Sentence Case格式
嘿,我来帮你搞定这个MySQL文本格式转换的问题!要把列里那种每个单词首字母都大写的标题格式(Title Case)转成只有每个句子开头首字母大写的句子格式(Sentence Case),咱们可以用MySQL自带的字符串函数组合来实现,我给你一步步讲清楚:
先再明确下需求的前后对比,方便你对照:
原始Title Case文本:
This Is A Dog. That Is A Cat.期望的Sentence Case输出:
This is a dog. That is a cat.
方法一:用REGEXP_REPLACE(MySQL 8.0及以上版本推荐)
如果你的MySQL是8.0或更高版本,直接用正则替换会非常灵活,这是最省心的方案。假设你的表名是your_table,要处理的列是your_column,可以先跑个SELECT测试效果,没问题再执行更新:
-- 先测试转换效果,确认没问题再执行更新 SELECT your_column AS 原始文本, REGEXP_REPLACE( CONCAT( UPPER(SUBSTRING(LOWER(your_column), 1, 1)), SUBSTRING(LOWER(your_column), 2) ), '\\. ([a-z])', '. ' || UPPER('$1') ) AS 转换后文本 FROM your_table;
如果测试结果符合预期,就可以用UPDATE语句批量更新列内容:
UPDATE your_table SET your_column = REGEXP_REPLACE( CONCAT( UPPER(SUBSTRING(LOWER(your_column), 1, 1)), SUBSTRING(LOWER(your_column), 2) ), '\\. ([a-z])', '. ' || UPPER('$1') );
我给你拆解下这个语句的逻辑:
- 先用
LOWER(your_column)把整个文本转成全小写 - 把文本的第一个字符转成大写,再和后面的小写内容拼接,确保第一个句子的开头是大写
- 最后用
REGEXP_REPLACE匹配所有“句号+空格+小写字母”的位置,把那个小写字母替换成大写,这样每个后续句子的开头就都大写了
要是你的文本里还有问号、感叹号结尾的句子,只要把正则表达式里的\\.改成[.!?]就行,比如把正则部分换成'([.!?]) ([a-z])',替换内容改成'$1 ' || UPPER('$2'),就能覆盖更多句子结尾的场景。
方法二:低版本MySQL(8.0以下)的替代方案
要是你的MySQL版本比较老,不支持REGEXP_REPLACE,那只能用嵌套的REPLACE函数来处理,但这种方法比较死板,只适合句子分隔符单一、常用开头字母不多的场景,比如:
UPDATE your_table SET your_column = CONCAT( UPPER(SUBSTRING(LOWER(your_column), 1, 1)), REPLACE( REPLACE( REPLACE( SUBSTRING(LOWER(your_column), 2), '. t', '. T' ), '. a', '. A' ), '. i', '. I' ) -- 这里可以继续添加其他常见开头字母的替换,比如'. h'→'. H'之类的 );
不过这种方法显然不够灵活,能覆盖的场景有限,要是有条件的话,还是建议升级到MySQL 8.0以上版本用方法一。
重要提醒
不管用哪种方法,执行UPDATE之前一定要先备份数据,或者先用SELECT语句测试转换效果,避免误改数据!
备注:内容来源于stack exchange,提问作者Photon

