在迁移

时间:2018-06-06 23:01:33

标签: postgresql

我对postgresql很新,并且已经找到了一些关于如何在选择但不是迁移中执行此操作的信息。我有一个具有名称列的用户数据库,我希望将其转换为名字和姓氏列。以下是一些示例名称以及我希望如何在userinfo表中转换它们:

name
------
"first last"
"first double last-name"
"first"
"No Name Available"

first_name            | last_name
----------------------|------------
"first"               | "last"
"first"               | "double last-name"
"first"               | ""
"No Name Available"   | ""

基本上,我想在迁移中将名称拆分为第一个空格中的first_name和last_name,其名称不包含last_name的空字符串,除非name等于“No Name Available”,在这种情况下我想将first_name设置为“No Name Available”,将last_name设置为“”。以下是我的全部内容:

alter table UserInfo
    add column first_name text UserInfo on delete cascade,
    add column last_name text UserInfo on delete cascade

--;;

update UserInfo
  set first_name = ???
  set last_name = ???

--;;

alter table UserInfo
    alter column first_name set not null,
    alter column last_name set not null,
    drop column name

感谢任何帮助,包括部分解决方案;我不确定如何开始。

2 个答案:

答案 0 :(得分:2)

首先使用first_name和last_name作为列创建用户表,然后使用insert

运行它
select 
case when name != 'No Name Available' then
SPLIT_PART(name, ' ', 1)
else
'No Name Available'
end as first_name,
case when name != 'No Name Available' then
SPLIT_PART(name, SPLIT_PART(name, ' ', 1), 2)
else 
'' end as last_name
from users

假设用户是当前表的名称,其名称为列

答案 1 :(得分:1)

您可以使用case分隔"No Name Avaiable"案例,然后使用正则表达式来标识名称的第一个名称和第二部分,并在regexp_replace的替换部分中调用它

以下是完整的示例:

create table UserInfo(
    name text
);

insert into UserInfo (name) values 
('first last'),
('first double last-name'),
('first'),
('No Name Available');


alter table UserInfo
    add column first_name text ,
    add column last_name text;

update UserInfo
  set first_name = case 
         when name = 'No Name Avaiable' 
         then 'No Name Avaiable' 
         else regexp_replace(name, '^([^ ]+)\s+(.*)$','\1') 
      end,
      last_name  = case 
         when name = 'No Name Avaiable' 
         then ''                 
         else regexp_replace(name, '^([^ ]+)\s+(.*)$','\2') 
      end;

alter table UserInfo
    alter column first_name set not null,
    alter column last_name set not null,
    drop column name;

select * from UserInfo;