PostgreSQL,如何在不创建重复项的情况下将数组更新为现有数组?
PostgreSQL, how to update an array into an existing array without creating duplicates?
我有一列文本[],看起来像:
{"FName1 LName1", "FName3 LName3", "FName4 LName4"}
接下来我想将另一个名称数组合并到已存储的数组中,但不在其中创建任何重复项。我该怎么做?
例如,我想包含的另一个数组如下所示:
{"FName4 LName4", "FName1 LName1", "FName2 LName2"}
因此我希望它像这样存储:
{"FName1 LName1", "FName2 LName2", "FName3 LName3", "FName4 LName4"}
新数组中的元素可以按任何顺序排列,只要在新(创建的)存储数组中没有重复的元素(此处为名称)即可。
我找不到为我执行此操作的 PostgreSQL 数组函数。我只是想出了如何附加或前置一个数组(有重复项)。
有没有办法不用先读那一行?我真的不想先看这一行。
根据评论编辑:
创建 table 包括测试行示例:
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
您将不得不编写一个函数来处理该问题:
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
将删除重复项。
我有一列文本[],看起来像:
{"FName1 LName1", "FName3 LName3", "FName4 LName4"}
接下来我想将另一个名称数组合并到已存储的数组中,但不在其中创建任何重复项。我该怎么做?
例如,我想包含的另一个数组如下所示:
{"FName4 LName4", "FName1 LName1", "FName2 LName2"}
因此我希望它像这样存储:
{"FName1 LName1", "FName2 LName2", "FName3 LName3", "FName4 LName4"}
新数组中的元素可以按任何顺序排列,只要在新(创建的)存储数组中没有重复的元素(此处为名称)即可。
我找不到为我执行此操作的 PostgreSQL 数组函数。我只是想出了如何附加或前置一个数组(有重复项)。
有没有办法不用先读那一行?我真的不想先看这一行。
根据评论编辑:
创建 table 包括测试行示例:
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
您将不得不编写一个函数来处理该问题:
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
将删除重复项。