Простой способ прочитать электронную почту для сопоставления имени пользователя и, если он присутствует, просто использовать значение вместо нескольких условий IF ELSE. - PullRequest
0 голосов
/ 01 марта 2019

Я перемещаю данные из таблицы 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?

1 Ответ

0 голосов
/ 01 марта 2019

Единственный хороший способ, который я нашел, это этот -

create or replace function update_table() returns void as $$
declare
  rw table2%rowtype;
  js jsonb := '{"abc@gmail.com": "testabc", "def@gmail.com": "testdef"}';
  i record;
  prefix text;
  emails text;
  emaili text;
  user_id text;
  userByJson 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
      found = false;
      select username
      into user_id
      from users where email = emaili;
      userByJson = (SELECT elem->> emaili FROM jsonb(js) elem);
      IF userByJson is not null THEN
        prefix := prefix || ' ' || userByJson;
        ELSE
        prefix := prefix || ' ' || user_id;
      END IF;   
    end loop;

    insert into table2 values
    (nextval ('table2_id_seq'), prefix);
  end loop;
end;
$$
language plpgsql;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...