如何按大写字母拆分SQL表中Name列的连写姓名并添加空格?
解决连写姓名拆分的SQL方案
你的原SQL无法工作的核心原因是:原始姓名里没有空格,LOCATE(' ', name)会返回0,导致SUBSTRING的截取逻辑完全失效。需要换思路——找到姓名中首字符之后第一个大写字母的位置,插入空格拆分姓和名。
以下是不同SQL方言的可行方案:
MySQL/MariaDB
使用正则替换函数REGEXP_REPLACE,匹配小写字母后跟大写字母的位置,插入空格:
SELECT REGEXP_REPLACE(name, '([a-z])([A-Z])', '$1 $2') AS full_name FROM dim_players;
逻辑:正则([a-z])([A-Z])匹配姓名中所有小写字母接大写字母的位置,用$1 $2替换(保留原字符,中间加空格),一次完成所有拆分。
PostgreSQL
语法和MySQL类似,正则替换函数同样是REGEXP_REPLACE,仅捕获组引用方式略有不同:
SELECT REGEXP_REPLACE(name, '([a-z])([A-Z])', '\1 \2') AS full_name FROM dim_players;
SQL Server
SQL Server无直接正则替换函数,可通过STUFF结合PATINDEX实现:
SELECT STUFF(name, PATINDEX('%[A-Z]%', SUBSTRING(name, 2, LEN(name))) + 1, 0, ' ') AS full_name FROM dim_players;
逻辑:先截取第二个字符开始的子串,用PATINDEX找到其中第一个大写字母的位置,加1后定位到原字符串中需要插入空格的位置,最后用STUFF插入空格。
以上方案均可正确处理ViratKohli→Virat Kohli、ObedMcCoy→Obed McCoy这类场景。
内容的提问来源于stack exchange,提问作者Sanil Kumar Barik
相关产品推荐
相关产品推荐

