【问题标题】:Split column into two columns in a migration在迁移中将列拆分为两列
【发布时间】:2018-11-16 18:04:07
【问题描述】:

我对 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

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

【问题讨论】:

  • 更详细地定义术语“迁移”。你为此使用任何工具吗?或者你正在加载文件?还是您构建查询并执行它们?等等。从 Postgres 到 Postgres 或从任何其他 DBMS?

标签: postgresql


【解决方案1】:

首先创建以 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

假设users是当前表的名称,名称为列

【讨论】:

    【解决方案2】:

    您可以使用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;
    

    【讨论】:

      猜你喜欢
      • 2011-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多