从单独的键和值数组构造 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;
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;