首页 > 解决方案 > 数组中的不同值

问题描述

你好我有问题我有桌子

CREATE TABLE doctor(
idDoc SERIAL PRIMARY KEY,
meds TEXT[]
);

如果我的用户在里面输入相同的药物,我只想存储唯一值

用户插入前的表格

ID 药物
1 {Nalfon,Ocufen,Actron}

用户插入后(插入为 Actron、Soma、Robaxin)我想更新并在表中包含旧值和新值(Actron相同)如果我用新值更新表我会得到

UPDATE doctor SET meds='{Actron,Soma,Robaxin}') WHERE id=1;
ID 药物
1 {Actron,Soma,Robaxin}

但我想要

ID 药物
1 {Nalfon,Ocufen,Actron,Soma,Robaxin}

我不知道如何检查新值是否与表中的值相同,并且只有插入/更新表才能具有唯一值。

标签: sqlarrayspostgresql

解决方案


给定您的数据结构,您可以取消现有药物的嵌套,添加新药物,然后重新聚合为唯一数组:

UPDATE doctor d
    SET meds = (select array_agg(distinct med)
                from (select med
                      from unnest('{Actron,Soma,Robaxin}'::text[]) u(med)
                      union all
                      select med
                      from unnest(d.meds) u(med)
                     ) m
               )
    WHERE idDoc = 1;

是一个 db<>fiddle。

也就是说,您可能会考虑使用一个接线表,每个医生和每个药物都有一行。这是多对多关系的更传统的 SQL 表示。


推荐阅读