Разделить столбец на два столбца в миграции - PullRequest
0 голосов
/ 07 июня 2018

Я довольно новичок в 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, если имя не равно «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 голосов
/ 08 июня 2018

Сначала создайте пользовательскую таблицу с 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 - это имя текущей таблицы с именем в качестве столбца

0 голосов
/ 07 июня 2018

Вы можете использовать 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...