Итак, у меня есть 2 идентичные таблицы table1 и table2.Я хочу перенести данные из таблицы1 в таблицу2.
Я могу использовать этот запрос: -
insert into table2(table2_id, definition_string, description, active)
select nextval('table2_id_seq'), definition_string, description, active from table1;
Но есть еще некоторые изменения, которые нужно сделать в столбце definition_string
.
Столбец definition_string
новой таблицыtable2
теперь должны иметь электронные письма, замененные именами пользователей, которые были в table1
.
Например -
table1
Definition_string =
SEND open TO abc@gmail.com
SEND close TO abc@gmail.com
SEND open TO def@gmail.com ghi@gmail.com
SEND close TO def@gmail.com ghi@gmail.com
SEND open TO jkl@gmail.com
SEND close TO jkl@gmail.com
Вышеприведенная строка Definition должна быть заменена на -
table2
Definition_string =
SEND open TO usera
SEND close TO usera
SEND open TO userb userc
SEND close TO userb userc
SEND open TO userd
SEND close TO userd
Замена электронной почты на имя пользователя должна основываться на поиске в таблице user
-
select username from user where email = 'abc@gmail.com';
РЕЗУЛЬТАТ:
username =
usera
userx
usery
Приведенный выше запрос может привести к одному или нескольким именам пользователей.Если запрос приводит к более чем одному имени пользователя, то мы будем рассматривать только первое имя для замены.
Хотя это и не правильно, но я попробовал это -
update
table2
set
definition_string = case when definition_string = 'SEND open TO abc@gmail.com' then (
select
username
from
user
where
email = 'abc@gmail.com'
) when definition_string = 'SEND close TO def@gmail.com ghi@gmail.com' then (
select
username
from
user
where
email = 'def@gmail.com' || 'ghi@gmail.com'
) else definition_string -- don't change anything
end;
Я думал написатьцикл for, который перебирает все строки table1
.Но кажется, что это не эффективно зацикливаться?