sql - 数组中的不同值
问题描述
你好我有问题我有桌子
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} |
我不知道如何检查新值是否与表中的值相同,并且只有插入/更新表才能具有唯一值。
解决方案
给定您的数据结构,您可以取消现有药物的嵌套,添加新药物,然后重新聚合为唯一数组:
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 表示。
推荐阅读
- typescript - 泛型类型的类型推断
- java - 在java中使用递归打印数字而没有最大数字
- javascript - React-native 创建库“null 不是对象(评估 '_reactNativeStartappAds.default.showMessage')”
- url - 如何创建链接以直接编辑 SharePoint 列表项
- android - 长按编辑文本时限制/删除自动填充选项
- python - 如何将列(average_user_rating)添加到数据框中,为我提供该行中 userId 的平均评分?
- sql - sql server 12中非常奇怪的索引性能
- python - 禁止命令 discord.py 的问题(重写分支)
- c++ - 编译创建 Eigen::ThreadPoolDevice 对象的代码时出错
- javascript - 如何在节点 js 中通过相同的路由在两个模式中添加相同的数据?