如何在PostgreSQL 8.0.2 Redshift中拆分变体姓名为姓和名
适配多格式姓名拆分的Redshift SQL方案
针对你提到的多种姓名格式(含中间名、带连字符姓氏、缩写名等),可以通过正则表达式结合条件判断实现准确拆分,以下是适配Redshift(PostgreSQL 8.0.2内核)的SQL语句:
SELECT full_name, -- 提取名(含中间名、缩写格式) CASE WHEN TRIM(full_name) NOT LIKE '% %' THEN TRIM(full_name) ELSE REGEXP_REPLACE(TRIM(full_name), ' [^ ]+$', '') END AS first_name, -- 提取姓(含连字符格式) CASE WHEN TRIM(full_name) NOT LIKE '% %' THEN '' ELSE REGEXP_SUBSTR(TRIM(full_name), '[^ ]+$') END AS last_name FROM your_table;
逻辑说明
- 预处理:用
TRIM()清除姓名前后的冗余空格,避免干扰正则匹配 - 单字姓名处理:如果姓名不含空格(仅单个名字),直接将全名赋值给
first_name,last_name设为空字符串 - 多部分姓名处理:
REGEXP_REPLACE(TRIM(full_name), ' [^ ]+$', ''):匹配最后一个空格及其后续所有非空格字符并替换为空,保留除最后一部分外的所有内容作为first_name(适配带中间名、缩写的格式,如Lisa Marie Scott→Lisa Marie,A.J. Jackson→A.J.)REGEXP_SUBSTR(TRIM(full_name), '[^ ]+$'):匹配字符串末尾的所有非空格字符,提取最后一部分作为last_name(适配带连字符的姓氏,如Anna Jones-Porter→Jones-Porter)
测试验证
| full_name | first_name | last_name |
|---|---|---|
| Jeff Davis | Jeff | Davis |
| Anna Jones-Porter | Anna | Jones-Porter |
| Lisa Marie Scott | Lisa Marie | Scott |
| A.J. Jackson | A.J. | Jackson |
| Obama | Obama | |
| John Michael O'Connor | John Michael | O'Connor |
内容的提问来源于stack exchange,提问作者wizkids121
相关产品推荐
相关产品推荐

