gpt4 book ai didi

sql - 从 postgres 的字符串数组列中删除重复条目

转载 作者:行者123 更新时间:2023-11-29 13:08:39 24 4
gpt4 key购买 nike

我有一个 PostgreSQL 表,其中有一列包含字符串数组。该行有一些独特的数组字符串或一些也有重复的字符串。我想从每行中删除重复的字符串(如果存在)。

我已经尝试过一些查询,但无法实现。

表格如下:

  veh_id |             vehicle_types              
--------+----------------------------------------
1 | {"byd_tang","volt","viper","laferrari"}
2 | {"volt","viper"}
3 | {"byd_tang","sonata","jaguarxf"}
4 | {"swift","teslax","mirai"}
5 | {"volt","viper"}
6 | {"viper","ferrariff","bmwi8","viper"}
7 | {"ferrariff","viper","viper","volt"}

我期待以下输出:

  veh_id |             vehicle_types              
--------+----------------------------------------
1 | {"byd_tang","volt","viper","laferrari"}
2 | {"volt","viper"}
3 | {"byd_tang","sonata","jaguarxf"}
4 | {"swift","teslax","mirai"}
5 | {"volt","viper"}
6 | {"viper","ferrariff","bmwi8"}
7 | {"ferrariff","viper","volt"}

最佳答案

由于每一行的数组都是独立的,因此使用 ARRAY 构造函数的普通相关子查询可以完成这项工作:

SELECT *, ARRAY(SELECT DISTINCT unnest (vehicle_types)) AS vehicle_types_uni
FROM vehicle;

参见:

请注意,NULL 被转换为一个空数组 ('{}')。我们需要对其进行特殊处理,但无论如何它都被排除在下面的 UPDATE 中。

快速简单。但是不要使用它。您没有这么说,但通常您希望保留数组元素的原始顺序。您的基本样本表明了这一点。在相关子查询中使用 WITH ORDINALITY,这会变得更复杂一些:

SELECT *, ARRAY (SELECT v
FROM unnest(vehicle_types) WITH ORDINALITY t(v,ord)
GROUP BY 1
ORDER BY min(ord)
) AS vehicle_types_uni
FROM vehicle;

参见:

UPDATE 以实际删除欺骗:

UPDATE vehicle
SET vehicle_types = ARRAY (
SELECT v
FROM unnest(vehicle_types) WITH ORDINALITY t(v,ord)
GROUP BY 1
ORDER BY min(ord)
)
WHERE cardinality(vehicle_types) > 1 -- optional
AND vehicle_types <> ARRAY (
SELECT v
FROM unnest(vehicle_types) WITH ORDINALITY t(v,ord)
GROUP BY 1
ORDER BY min(ord)
); -- suppress empty updates (optional)

两个添加的 WHERE 条件都是可选的,以提高性能。第一个是完全多余的。每个条件还排除了 NULL 情况。第二个抑制所有空更新。

参见:

如果您尝试在不保留原始顺序的情况下执行此操作,您可能会在不需要的情况下更新大多数行,只是因为即使没有重复,顺序或元素也发生了变化。

需要 Postgres 9.4 或更高版本。

db<> fiddle here

关于sql - 从 postgres 的字符串数组列中删除重复条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57810811/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com