从单独的键和值数组构造 JSONB

Construct JSONB from separate arrays of keys and values

PostgreSQL 有一个非常有用的 hstore(text[], text[]) 函数,它将 "construct an hstore from separate key and value arrays"。我正在寻找等效的 JSONB,但我可以看到 there isn't one。也许我需要重写我正在研究的语句(但可以使用一些帮助,因为我想不出 "merge" 两个数组的方法)

SELECT HSTORE(ARRAY['value1', 'value2', 'value3'], 
  (SELECT ARRAY_AGG(ROUND(n, 3)) FROM UNNEST(ARRAY[1.001, 2.0045, 3]) n)::TEXT[]);

如您所见,第一个参数为"keys",第二个参数为"values",但四舍五入为三位数。我最后想要 JSONB 而不是 HSTORE 对象。

请不要建议从 HSTORE 转换为 JSONB,我也想摆脱 HSTORE 扩展 ;) 但是,是的,否则会起作用。

我正在使用 PostgreSQL 11.4。

注意:函数 jsonb_object(keys text[], values text[]) 非常接近我需要的,除了值被限制为 TEXT[] 而我需要 NUMERIC[] .


答案(改编自的回答)

SELECT jsonb_object_agg(key, val)
FROM (
  SELECT key, ROUND(val, 3) as val 
  FROM UNNEST(ARRAY['value1', 'value2', 'value3'], ARRAY[1.001, 2.0045, 3]) AS row(key, val)
) t;

如果你确定两个数组总是有相同数量的元素,你可以使用这样的东西:

select jsonb_object_agg(k,v)
from (
  select unnest(ARRAY['value1', 'value2', 'value3']) as k, 
         unnest(ARRAY[1.001, 2.0045, 3]) as v
) t;

如果您经常需要,我会为此创建一个函数:

create function jsonb_from_array(p_keys text[], p_values anyarray)
  returns jsonb
as
$$
  select jsonb_object_agg(k,v)
  from (
    select unnest(p_keys) as k, 
           unnest(p_values) as v
  ) t;
$$
language sql
immutable;