Я перемещаю данные из таблицы table1 в table2 и заменяю электронную почту именем пользователя для столбца definition_string
в таблице table2.
Таблицы похожи на: -
CREATE TABLE table1
(
table1_id bigint NOT NULL DEFAULT nextval('table1_id_seq'::regclass),
definition_string text COLLATE pg_catalog."default",
CONSTRAINT table1_pkey PRIMARY KEY (table1_id)
)
CREATE TABLE table2
(
table2_id bigint NOT NULL DEFAULT nextval('table2_id_seq'::regclass),
definition_string text COLLATE pg_catalog."default",
CONSTRAINT table2_pkey PRIMARY KEY (table2_id)
)
Значение в *Столбец 1007 * выглядит следующим образом: -
definition_string = 'SEND open TO abc@gmail.com'
definition_string = 'SEND open TO def@gmail.com ghi@gmail.com'
В одном письме может быть несколько имен пользователей из таблицы users
.
Например:
select username from users where email = 'abc@gmail.com';
ВЫХОД:
username: testabc, blablabla
Если он содержит несколько имен пользователей, то я хочу, чтобы выбранное имя пользователя было только частью новой таблицы.
Для этого у меня есть список для сопоставления:
'abc@gmail.com','testabc'
'def@gmail.com','testdef'
Данные слишком велики, и я не хочу, чтобы несколько условий IF ELSE, как показано в функции ниже, отображали электронную почту с именем пользователя-
create or replace function update_table() returns void as $$
declare
rw table2%rowtype;
prefix text;
emails text;
emaili text;
user_id text;
begin
for rw in select * from table1
loop
prefix := substring (rw.definition_string from '(SEND \w+ TO) ');
emails := substring (rw.definition_string from 'SEND \w+ TO (.+)');
foreach emaili in array string_to_array (emails, ' ')
loop
select username
into user_id
from users where email = emaili;
IF emaili = 'abc@gmail.com' THEN
prefix := prefix || ' ' || 'testabc';
ELSE IF emaili = 'def@gmail.com' THEN
prefix := prefix || ' ' || 'testdef';
ELSE
prefix := prefix || ' ' || user_id;
END IF;
end loop;
insert into table2 values
(nextval ('table2_id_seq'), prefix);
end loop;
end;
$$
language plpgsql;
Существует ли простой способ прочитать электронную почту для сопоставления имени пользователя и, если она присутствует, просто использовать значение вместо нескольких условий IF ELSE?