如何提取sales person表中姓名各部分首字母生成缩写?
提取姓名各部分首字母生成缩写的SQL实现
要实现提取姓名各部分首字母并拼接成缩写的需求,核心思路是先将姓名按空格拆分为独立部分,再提取每个部分的首字母(转为大写),最后拼接在一起。不同数据库的实现方式略有差异,以下是几种主流数据库的解决方案:
MySQL/MariaDB
如果你的MySQL版本支持递归CTE(8.0+),可以用递归拆分姓名后聚合首字母:
WITH RECURSIVE name_parts AS ( SELECT name, 1 AS pos, SUBSTRING_INDEX(name, ' ', 1) AS part, SUBSTRING(name, LENGTH(SUBSTRING_INDEX(name, ' ', 1)) + 2) AS remaining FROM `sales person` UNION ALL SELECT name, pos + 1, SUBSTRING_INDEX(remaining, ' ', 1), SUBSTRING(remaining, LENGTH(SUBSTRING_INDEX(remaining, ' ', 1)) + 2) FROM name_parts WHERE remaining != '' ) SELECT name, GROUP_CONCAT(UPPER(SUBSTRING(part, 1, 1)) ORDER BY pos SEPARATOR '') AS initials FROM name_parts GROUP BY name;
也可以用正则表达式直接替换提取:
SELECT name, UPPER(REGEXP_REPLACE(name, '([^ ]+)', SUBSTRING('\\1', 1, 1), 1, 0)) AS initials FROM `sales person`;
SQL Server(2016及以上版本)
利用STRING_SPLIT拆分姓名,再用STRING_AGG聚合首字母:
SELECT sp.name, STRING_AGG(UPPER(LEFT(ss.value, 1)), '') WITHIN GROUP (ORDER BY CHARINDEX(ss.value, sp.name)) AS initials FROM [sales person] sp CROSS APPLY STRING_SPLIT(sp.name, ' ') ss WHERE ss.value != '' -- 过滤连续空格产生的空值 GROUP BY sp.name;
PostgreSQL
用正则表达式可以快速实现:
SELECT name, UPPER(REGEXP_REPLACE(name, '(\w)\w* ?', '\1', 'g')) AS initials FROM "sales person";
或者拆分字符串后聚合:
SELECT name, STRING_AGG(UPPER(SUBSTRING(part, 1, 1)), '') AS initials FROM "sales person", UNNEST(STRING_TO_ARRAY(name, ' ')) AS part WHERE part != '' GROUP BY name;
补充说明
你之前尝试的LEFT()函数只能提取整个字符串的第一个字符,无法处理多部分姓名的拆分,所以需要通过拆分字符串+聚合首字母的方式来实现需求。
内容的提问来源于stack exchange,提问作者Johan vd Westhuizen
相关产品推荐
相关产品推荐

