SQL 服务器 - 从姓名列表中获取首字母

SQL Server - Getting initials from a list of names

我有一个 table 包含分配给某个项目的员工列表。有点像这样:

ID  Employees
122 Mark Doe
210 John Doe
212 Julie Doe, Yuri Doe

我必须转换 Employees 列以获取名字的首字母和完整的姓氏。结果应如下所示:

ID  Employees
122 M. Doe
210 J. Doe
212 J. Doe, Y. Doe

当值包含多个名称时会出现问题。可以为此做些什么?

PostgreSQL 的解决方案。假设一个单元格中的多个名称始终由逗号和随后的 space 分隔,您可以


1 将所有多名称单元格展开成单独的行
2 将带有名称的列拆分为单独的列,分别代表名字和姓氏
3 从名字中提取第一个字母并将其与姓氏连接起来


CREATE TABLE employees (id int, employee VARCHAR(50))
INSERT INTO employees (id, employee)
VALUES 
(122, 'Mark Doe'),
(210, 'John Doe'),
(212, 'Julie Doe, Yuri Doe');
 
 SELECT
 id
 ,left(split_part(firs_last_name,' ',1),1) || '. ' || split_part(firs_last_name,' ',2) 
 as  wanted_name
 ,split_part(firs_last_name,' ',1) as first_name
 ,split_part(firs_last_name,' ',2) as last_name
 FROM
   (
   Select 
   id, unnest(string_to_array(employee, ', ')) as firs_last_name
    FROM employees
   ) s

|  id | wanted_name | first_name | last_name |
|-----|-------------|------------|-----------|
| 122 |      M. Doe |       Mark |       Doe |
| 210 |      J. Doe |       John |       Doe |
| 212 |      J. Doe |      Julie |       Doe |
| 212 |      Y. Doe |       Yuri |       Doe |

如果你想恢复单元格中的多个名字,你可以在最后一步将它们聚合起来

CREATE TABLE employees (id int, employee VARCHAR(50))
INSERT INTO employees (id, employee)
VALUES 
(122, 'Mark Doe'),
(210, 'John Doe'),
(212, 'Julie Doe, Yuri Doe');
 
 with transformed_names as 
 (SELECT
 id
 ,left(split_part(firs_last_name,' ',1),1) || '. ' || 
  split_part(firs_last_name,' ',2)  as  wanted_name
 ,split_part(firs_last_name,' ',1) as first_name
 ,split_part(firs_last_name,' ',2) as last_name
 FROM
   (
   Select 
   id ,unnest(string_to_array(employee, ', ')) as firs_last_name
   FROM employees
   ) s)

SELECT
id
, string_agg(wanted_name, ', ') as wanted_names  
from transformed_names
GROUP BY 
id

|  id |     string_agg |
|-----|----------------|
| 122 |         M. Doe |
| 210 |         J. Doe |
| 212 | J. Doe, Y. Doe |

但话又说回来,这完全取决于您 table

中干净一致的数据