Postgres:使用给定的键集和默认值创建 jsonb 对象

Postgres: Create jsonb object with given set of keys and a default value

我正在使用 PostgreSQL 9.6。我有一个像 ARRAY['a', 'b']::text[] 这样的数组,它来自应用程序代码并在 SQL 中进行了一些转换,所以我不知道它在应用程序代码中的长度。

在 table 中,我有一个 jsonb 类型的字段,我需要将其设置为 json 对象,其中键是给定数组中的值,值是 都一样并且等于当前时间戳,即

| id | my_field                                         |
---------------------------------------------------------
| 1  | {"a":"1544605046.21065", "b":"1544605046.21065"} |

我正在尝试查找更新查询来执行此更新,例如像

UPDATE mytable 
SET my_field = some_function(ARRAY['a','b']::text[], EXTRACT(EPOCH FROM CURRENT_TIMESTAMP)
WHERE <some_condition>;

我正在查看 jsonb_build_object 函数,如果我可以转换我的数组,将其元素与当前时间戳交错,这可能对我有帮助,但是我没有找到执行此操作的方法。

请注意,我可能有数十万条记录要更新,因此我正在寻找快速实施。

如有任何关于此事的建议,我将不胜感激。

demo:db<>fiddle

UPDATE my_table
SET my_field = s.json_data
FROM (
    SELECT jsonb_object_agg(key, extract(epoch from current_timestamp)) as json_data
    FROM unnest(array['a', 'b']) as u(key)
) s
WHERE <some condition>
  1. 要使用数组元素作为 json 对象的键,您需要通过 unnest 将它们分开。这会为每个元素创建一行。
  2. 聚合行 jsonb_object_agg(key, value)。作为关键,您正在使用数组元素列。作为值 current_timestamp。此函数聚合成您预期的语法。
  3. 将其放入子查询中可以进行更新。