PostgreSQL中如何将text[]数组转换为指定JSON格式(不使用array_to_json)
解决PostgreSQL中把成对text数组转成键值对JSON的问题
嘿,我懂你现在的困扰——array_to_json确实只能把数组原样转成JSON数组,没法帮你把成对的元素重新组合成键值对格式的JSON。不过别担心,PostgreSQL有专门的函数和方法来搞定这个需求,下面给你几个实用的方案:
方案一:直接用json_object/jsonb_object函数(最简便)
如果你的数组严格是偶数个元素,且正好是键、值依次排列,那json_object(对应JSON类型)或者jsonb_object(对应JSONB类型)就是最直接的解决方案,它们会自动把数组里的元素两两配对成键值对:
-- 转成JSON类型 SELECT json_object(text_text) AS key_value_json FROM test.tt; -- 转成JSONB类型(推荐,性能更好) SELECT jsonb_object(text_text) AS key_value_jsonb FROM test.tt;
执行后你会得到:{"111": "4", "101803": "5"}
注意点:
- 这个方法要求数组元素个数必须是偶数,否则会报错。
- 生成的JSON里键和值都是字符串类型,如果需要把值转成数字,可以看下面的进阶方案。
方案二:灵活处理类型转换(把值转成数字)
如果希望把值转换成数字类型(比如4和5变成数字而不是字符串),可以用jsonb_object_agg结合数组下标来实现:
SELECT jsonb_object_agg( arr_element.key, -- 判断值是否为数字,是则转成numeric类型,否则保留字符串 CASE WHEN arr_element.value ~ '^[0-9]+$' THEN arr_element.value::numeric ELSE arr_element.value END ) AS result_jsonb FROM ( SELECT text_text[i] AS key, text_text[i+1] AS value FROM test.tt, -- 生成数组的下标索引 generate_subscripts(text_text, 1) AS i -- 只取奇数下标(作为键的位置) WHERE i % 2 = 1 ) AS arr_element GROUP BY arr_element.key;
这个方案的好处是可以灵活处理值的类型,同时也能应对一些特殊情况(比如数组里偶尔有非数字值的场景)。
验证一下你的测试数据
先执行你的创建表和插入语句:
create table test.tt (text_text text[]); insert into test.tt values('{111,4,101803,5}');
然后用方案一的查询,就能得到你想要的{"111": "4", "101803": "5"}格式的JSON啦~
内容的提问来源于stack exchange,提问作者qian xiansheng
相关产品推荐
相关产品推荐

