PostgreSQL中如何将name列拆分为first_name与last_name列
PostgreSQL 拆分姓名列:处理含头衔(Mrs/Ms)的场景
你当前使用的查询仅按第一个空格拆分姓名,遇到带Mrs/Ms头衔的姓名(如Ms Ana Rodriguez)时,会错误地将Ms 作为first_name,剩余部分作为last_name,无法满足拆分需求。
原查询代码:
SELECT substring(name from 1 for (POSITION(' ' IN name))) "first_name" ,substring(name from (POSITION(' ' IN name))+1) "last_name" FROM flores_comahue fc
解决方案:正则匹配处理头衔
通过正则表达式识别头衔前缀,针对性拆分first_name和last_name,支持不区分大小写匹配各类头衔写法(如Mrs/mrs/MS):
方法1:数组拆分+条件判断
SELECT CASE WHEN name ~* '^(mrs|ms)\s' THEN array_to_string((regexp_split_to_array(name, '\s+'))[1:2], ' ') ELSE (regexp_split_to_array(name, '\s+'))[1] END AS first_name, CASE WHEN name ~* '^(mrs|ms)\s' THEN array_to_string((regexp_split_to_array(name, '\s+'))[3:], ' ') ELSE array_to_string((regexp_split_to_array(name, '\s+'))[2:], ' ') END AS last_name FROM flores_comahue;
方法2:正则直接提取子串
SELECT substring(name from '^(mrs|ms)\s+\S+|\S+') AS first_name, substring(name from '^(mrs|ms)\s+\S+\s+(.*)|\S+\s+(.*)') AS last_name FROM flores_comahue;
说明
~*用于不区分大小写的正则匹配,覆盖Mrs/ms等各种大小写形式- 若需要支持更多头衔(如
Mr/Dr),只需在正则的(mrs|ms)部分添加对应的选项,比如(mrs|ms|mr|dr) - 两种方法均能处理姓名中多个连续空格的情况
内容的提问来源于stack exchange,提问作者Miroshnitshenko Patricio
相关产品推荐
相关产品推荐

