PostgreSQL,如何在不创建重复项的情况下将数组更新为现有数组?

Posted

技术标签:

【中文标题】PostgreSQL,如何在不创建重复项的情况下将数组更新为现有数组?【英文标题】:PostgreSQL, how to update an array into an existing array without creating duplicates? 【发布时间】:2022-01-22 08:38:05 【问题描述】:

我有一列 text[] 看起来像:

"FName1 LName1", "FName3 LName3", "FName4 LName4"

接下来我想将另一个名称数组合并到那个已经存储的数组中,但不要在其中创建任何重复项。我该怎么做?

例如,我想要包含的另一个数组如下所示:

"FName4 LName4", "FName1 LName1", "FName2 LName2"

因此,我希望将其存储为:

"FName1 LName1", "FName2 LName2", "FName3 LName3", "FName4 LName4"

新数组中的元素可以按任何顺序排列,只要新(创建的)存储数组中没有元素(此处为名称)重复即可。


我找不到可以为我执行此操作的 PostgreSQL 数组函数。我只知道如何附加或前置一个数组(有重复项)。

有没有办法不必先阅读该行?我真的不想先阅读该行。


根据评论编辑:

创建包含测试行示例的表:

CREATE TABLE users (
 indexid TEXT PRIMARY KEY,
 name_list TEXT[] NOT NULL
);
INSERT INTO users VALUES ('iid_123', '"FName1 LName1", "FName3 LName3", "FName4 LName4"')

非常感谢@a_horse_with_no_name 的解决方案,它现在对我有用:

UPDATE users SET name_list=append_unique(name_list, '"FName4 LName4", "FName1 LName1", "FName2 LName2"') WHERE indexid = 'iid_123'

文档:

https://www.postgresql.org/docs/current/functions-array.html#ARRAY-FUNCTIONS-TABLE https://www.postgresql.org/docs/current/functions-string.html

【问题讨论】:

Edit问题并提供minimal reproducible example,即涉及的表或其他对象的CREATE语句(粘贴文本,不要使用图像,不要链接到外部站点),INSERT 用于示例数据的语句 (dito) 以及带有表格文本格式的示例数据的所需结果。 使用适当的规范化数据模型会容易得多 【参考方案1】:

你必须编写一个函数来处理它:

create function append_unique(p_input text[], p_to_append text[])
  returns text[]
as
$$
   select array_agg(element)
   from (
      select *
      from unnest(p_input) as t(element)
      union 
      select *
      from unnest(p_to_append) as t(element)
   ) x
$$
language sql
immutable;

UNION 将删除重复项。

【讨论】:

我对 PostgreSQL 还是很陌生,所以知道你可以制作自定义函数完全扩展了我的视野。非常感谢!

以上是关于PostgreSQL,如何在不创建重复项的情况下将数组更新为现有数组?的主要内容,如果未能解决你的问题,请参考以下文章

Postgresql:如何在不使用中间 hstore 的情况下将键值表转换为 json

如何让用户在不使用输入字段的情况下将文本输入 <li>? [关闭]

如何在不丢失 swift 精度的情况下将 String 转换为 Double [重复]

如何在不使用循环的情况下将json分配给另一个[重复]

如何在不使用 DateTimeFormatter 的情况下将字符串转换为 LocalDate [重复]

如何在不包含节点模块文件夹的情况下将我的 React 项目上传到 GitHub [重复]