json - Postgres:使用给定的键集和默认值创建 jsonb 对象
问题描述
我正在使用 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
。此函数聚合成您预期的语法。 - 将其放入子查询中可以让您进行更新。
推荐阅读
- amazon-web-services - 如何从 CloudFormation 为 AWS 上的 Windows Server 机器设置管理员密码?
- authentication - 如何登录 VS Code 账户管理,它是如何工作的?
- python - 在某些给定条件下,熊猫数据框中的 2 列的差异
- c++ - 如何初始化地图的复制构造函数?
- c - 如何使用 ZeroMQ 实现多个套接字?
- c++ - 比特币核心 libbitcoin_server_a-httpserver.o 错误
- python - 使用 azure.storage.blob 将 Python DataFrame 作为 CSV 写入 Azure Blob
- go - JetBrains 的 GoLand 如何找到接口的实现?
- cron - 从 crontab 中删除单个 cronjob
- java - 在使用 findall 或其他查询从存储库中获取属性值后更改属性值时,在 Spring Boot JPA 中禁用数据库更新