Postgres 唯一 JSON 数组聚合值

Postgres Unique JSON Array Aggregate Values

我有一个 table 存储这样的值:

| id | thing | values |
|----|-------|--------|
| 1  | a     |[1, 2]  |
| 2  | b     |[2, 3]  |
| 3  | a     |[2, 3]  |

并且想使用聚合函数按 thing 分组,但只存储数组的唯一值,这样结果将是:

| thing | values  |
|-------|---------|
| a     |[1, 2, 3]|
| b     |[2, 3]   |

在 Postgres 中是否有一种简单且高效的方法来执行此操作?

首先你将 JSON 数组与 json_array_elements() 分开 - 这是一个 set-returning 函数与 JOIN LATERAL 你得到一行 id, thing 和每个元素的 JSON 数组元素。

然后您 select DISTINCT 记录 thingvalue,按 value 排序。

最后,您将记录与 json_agg() 汇总在一起。

在 SQL 中看起来像:

SELECT thing, json_agg(value) AS values
FROM (
    SELECT DISTINCT thing, value
    FROM t
    JOIN LATERAL json_array_elements(t.values) AS v(value) ON true
    ORDER BY value) x
GROUP BY thing

通常您会希望使用 jsonb 类型,因为它比 json 更有效。然后你必须使用相应的 jsonb_...() 函数。