Postgres 将全名拆分为 3 个部分 First Middle Last

Postgres split full name to 3 parts First Middle Last

所有,我有一个不平凡的任务。 由于数据库结构发生变化,我需要将位于一个字段 usr_name 中的全名拆分为 3 个字段 usr_firstname,usr_middlename, usr_middlename.

到目前为止看起来很简单,我可以这样做:

update app_user
   set usr_firstname  = SPLIT_PART(usr_name, ' ',1),
       usr_middlename = SPLIT_PART(usr_name, ' ',2),
       usr_middlename = regexp_replace(usr_name, '^.* ', '') ;

然而,诀窍在于数据质量:(

有时全名没有中间名(例如Vasya Pupkin),而有时它有中间名(Vasya Vasyavich Pupkin)。

我可以很容易地得到字符串中的 1 个名字和字符串中的最后一个单词,但是我如何检索中间部分(如果存在)或忽略它(如果不存在)?

谢谢:)

我正在使用 Postgres 9.6

更新: table 的示例和

中的数据
create temporary table app_user

(
    usr_name text ,
    usr_firstname   text,
    usr_middlename text,
    usr_lastname text
);

insert into app_user
select 'Adam Chwesik ', null, null, null union all
select 'Vasya Pupkin', null, null, null union all
select 'Vasya Vasyavich Pupkin', null, null, null union all
select 'Aladdin Ali Ababwa', null, null, null ;

select * from app_user;

split_part 函数 returns 如果请求的部分不存在,则为空字符串,因此假设它只是可选的中间名,您可以简单地使用 case expression 来测试:

select split_part(user_name,' ',1) First_Name,
case when split_part(user_name,' ',3) ='' then '' else split_part(user_name,' ',2) end middle_name,
case when split_part(user_name,' ',3) ='' then split_part(user_name,' ',2) else split_part(user_name,' ',3) end last_name
from t

example fiddle

要更新您的示例 table:

update app_user set
usr_firstname=split_part(usr_name,' ',1),
usr_middlename=case when split_part(usr_name,' ',3) ='' then '' else split_part(usr_name,' ',2) end,
usr_lastname=case when split_part(usr_name,' ',3) ='' then split_part(usr_name,' ',2) else split_part(usr_name,' ',3) end

Working fiddle