1

所有,我有一个不平凡的任务。由于数据库结构更改,我需要将位于一个字段中的全名拆分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

更新:表和数据的示例

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;
4

1 回答 1

1

split_part如果请求的部分不存在,该函数将返回一个空字符串,因此假设它只是可选的中间名,您可以简单地使用 acase 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

参见示例小提琴

要更新您的示例表:

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

工作小提琴

于 2021-09-16T20:45:30.270 回答