You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何提取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 14:11:14