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
函数,如果我可以转换我的数组,将其元素与当前时间戳交错,这可能对我有帮助,但是我没有找到执行此操作的方法。
请注意,我可能有数十万条记录要更新,因此我正在寻找快速实施。
如有任何关于此事的建议,我将不胜感激。
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
。此函数聚合成您预期的语法。
- 将其放入子查询中可以进行更新。
我正在使用 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
函数,如果我可以转换我的数组,将其元素与当前时间戳交错,这可能对我有帮助,但是我没有找到执行此操作的方法。
请注意,我可能有数十万条记录要更新,因此我正在寻找快速实施。
如有任何关于此事的建议,我将不胜感激。
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
。此函数聚合成您预期的语法。 - 将其放入子查询中可以进行更新。