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

标签 json postgresql jsonb postgresql-9.6

我正在使用 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 函数,如果我可以转换我的数组,将其元素与当前时间戳交错,这可能对我有帮助,但是我没有找到执行此操作的方法。

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

对于此事,我将不胜感激。

最佳答案

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. 将其放入子查询中可以进行更新。

关于json - Postgres : Create jsonb object with given set of keys and a default value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53739571/

相关文章:

json - 使用jq更新字典数组中的一个值

android - 如何从 json 数组访问单个 json 对象?

Php - 不返回 Json 编码

sql - 将 Postgres JSON 列数据提取并扩展到单独的表中

javascript - 如何使用变量内容读取对象数组的内容

sql - 结束于 where 子句

database - pgAdmin数据库还原

sql - 从 JSON 字段的列表列表中查询

sql - Postgres 使用 jsonb 数组按价格从低到高排序

node.js - 如何将 JSONB 操作与 pg-promise 结合使用