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
要更新您的示例 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
所有,我有一个不平凡的任务。
由于数据库结构发生变化,我需要将位于一个字段 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
要更新您的示例 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