我正在使用 PostgreSQL 9.6。我有一个类似 ARRAY['a', 'b']::text[]
的数组,它来自应用程序代码并在 SQL 中进行了一些转换,所以我不知道它在应用程序中的长度代码。
在一个表中,我有一个类型为 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
函数,如果我可以转换我的数组,将其元素与当前时间戳交错,这可能对我有帮助,但是我没有找到执行此操作的方法。
请注意,我可能要更新数十万条记录,因此我正在寻找快速实现。
对于此事,我将不胜感激。
最佳答案
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>
- 要将数组元素用作 json 对象的键,您需要通过 unnest 将它们分开。这会为每个元素创建一行。
- 使用
jsonb_object_agg(key, value)
聚合行。作为关键,您正在使用数组元素列。作为值current_timestamp
。此函数聚合成您预期的语法。 - 将其放入子查询中可以进行更新。
关于json - Postgres : Create jsonb object with given set of keys and a default value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53739571/