Postgres:使用数组更新列,其值取自查找表

时间:2018-03-06 13:31:21

标签: arrays postgresql

我有一个包含列的表格: email1, email2, ... email5, domain_freqs和函数get_domain: get_domain(example@gmail.com) = gmail.com

我有一个查找表,其中包含数据库中所有电子邮件中出现的所有电子邮件域的频率:

word         nentry
gmail.com    130879
hotmail.com  12981
...

我想更新domain_freqs列以存储从查找表中提取的值数组。

例如,如果我有一条记录:

email1 = bob@gamil.com 
email2 = bob@hotmail.com

然后我想将ARRAY[130879, 12981, NULL, NULL, NULL]存储在domain_freqs列

1 个答案:

答案 0 :(得分:0)

想出来。对于大约1米的联系人记录数据库,大约需要6分钟。如果有人知道这样做的更有效方法......

update emails e
set domain_freqs = (    
    select array_agg(nentry) as dom_freqs from (
        select * from (
            select *, unnest(ARRAY[
              get_domain(email1),
              get_domain(email2),
              get_domain(email3),
              get_domain(email4),
              get_domain(email5)
            ]) as dom from emails e
        ) sub, LATERAL (
          select nentry from lookup_table lt 
            where word = dom
        ) lat
    ) agg group by id having e.id = agg.id
);