![](/img/trans.png)
[英]Postgres: How to alter jsonb value type for each element in an array?
[英]How to alter array to jsonb with data?
我有這樣的數據的數組列:
{foo,bar}
{foo}
{foo,foobar}
...
我想將其轉換為 jsonb:
[{"my_key": "foo", "state": true}, {"my_key": "bar", "state": true}]
[{"my_key": "foo", "state": true}]
[{"my_key": "foo", "state": true}, {"my_key": "foobar", "state": false}]
...
“狀態”在哪里
case when type = ANY('{"foo","bar"}'::text[]) then true
else false
我怎樣才能做到這一點? 謝謝
您可以取消嵌套值並使用橫向連接將它們聚合回來:
with t (data) as (
values
(array['foo','bar']),
(array['foo']),
(array['foo', 'foobar'])
)
select x.*
from t
cross join lateral (
select jsonb_agg(jsonb_build_object(
'my_key', x.type,
'state', x.type = any(array['foo','bar']))
) as val
from unnest(t.data) as x(type)
) x;
返回:
val
------------------------------------------------------------------------
[{"state": true, "my_key": "foo"}, {"state": true, "my_key": "bar"}]
[{"state": true, "my_key": "foo"}]
[{"state": true, "my_key": "foo"}, {"state": false, "my_key": "foobar"}]
在線示例: https : //rextester.com/MWUER75686
嘗試這個:
begin;
create table t (keys text[]);
insert into t values ('{"foo","bar"}'), ('{"foo"}'), ('{"foo","foobar"}');
create or replace function array2jsonb(a text[]) returns jsonb AS $$
DECLARE
k text; -- the current key
j jsonb := '[]'::jsonb; -- the jsonb array we collect the objects in
BEGIN
-- We loop over each key in the given array.
FOREACH k IN ARRAY a
LOOP
-- Concat a JSON object to the JSON array for every key in the array.
j = j || ('{"my_key":"' || k || '","state":' ||
case when k = ANY('{"foo","bar"}'::text[])
then true
else false
end || '}')::jsonb;
END LOOP;
return j;
END
$$ LANGUAGE plpgsql;
select array2jsonb(keys) from t;
rollback;
結果:
+--------------------------------------------------------------------------+
| array2jsonb |
|--------------------------------------------------------------------------|
| [{"state": true, "my_key": "foo"}, {"state": true, "my_key": "bar"}] |
| [{"state": true, "my_key": "foo"}] |
| [{"state": true, "my_key": "foo"}, {"state": false, "my_key": "foobar"}] |
+--------------------------------------------------------------------------+
參考:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.