读取一个变量 JSONB 并将其放入 postgresql 的列中
Posted
技术标签:
【中文标题】读取一个变量 JSONB 并将其放入 postgresql 的列中【英文标题】:Read a variable JSONB and put it into columns in postgresql 【发布时间】:2020-12-03 14:57:53 【问题描述】:我正在阅读具有 jsonb 列的 postgresql 数据库,jsonb 的长度是可变的。 我想阅读 jsonb 列并从中制作一个表格:
type | jsonb
---------------------------
a |[0,-0.9996,300,...] length -> 18
b |[1,89,10,...] length -> 16
a |[2,-0.79,200,...] length -> 18
...
我需要一个函数,根据输入为您提供下表, 输入=“输入a”:
Status | energ | time ... until the 18th value
-----------------------
0 | -0.9996 | 3000
输入 = “类型 b”:
SerialNumber | reference | status ... until the 16th value
---------------------------------
1 | 89 | 10
我正在尝试这样的事情:
CREATE OR REPLACE FUNCTION pg_temp.test()
RETURNS entry
AS $$
DECLARE
dato jsonb;
len integer;
BEGIN
FOR tsi,dato IN
SELECT ts,sgdata
FROM ingecms.samplegroup
WHERE samplegroup.cyclicgroupid = 7
ORDER BY 1
LOOP
len=jsonb_array_length(dato);
FOR x in 0..len-1 LOOP
entry = ---Reading the jsonb object from position 0 until len
END LOOP;
RETURN entry
END LOOP;
END; $$ LANGUAGE plpgsql;
SELECT * from pg_temp.test();
【问题讨论】:
列名从何而来?顺便说一句:您的数据不是有效的 JSON。您的意思是“[0,-0.9996,300,...]”(您有数组吗?)。是否所有类型的 JSON 值都恰好有 18 个值,或者类型中的长度是否不同。 长度与类型不同,列名来自另一个查询。我有一个 JSON 数据,我打算输入“[0,-0.9996,300,...]” 【参考方案1】:对于有效的 json,你可以使用函数jsonb_array_elements_text:
SELECT
*
FROM jsonb_array_elements_text('[0,-0.9996,300]'::jsonb);
【讨论】:
这条语句给了我下一个错误:错误:一个多行被用作表达式的子查询返回。我需要解析超过 1 个 jsonb 条目 我想问题不是将值扩展到行而是扩展到列。 上述查询在 9.5 版和 13 版中运行良好,刚刚测试了两者。你的查询一定是不同的,你能告诉我们吗? SELECT jsonb_array_elements_text((SELECT sgdata FROM ingecms.samplegroup INNER JOIN edlcygroupsV ON samplegroup.cyclicgroupid=edlcygroupsV.cyclicgroupid WHERE samplegroup.cyclicgroupid = 7 ORDER BY 1)); 如果我输入“LIMIT1”它可以工作,但我需要为超过 1 个 jsonb 执行此操作,SELECT jsonb_array_elements_text((SELECT sgdata FROM ingecms.samplegroup INNER JOIN edlcygroupsV ON samplegroup.cyclicgroupid=edlcygroupsV.cyclicgroupid WHERE samplegroup.cyclicgroupid = 7 ORDER BY 1 LIMIT 1));以上是关于读取一个变量 JSONB 并将其放入 postgresql 的列中的主要内容,如果未能解决你的问题,请参考以下文章
JDBCTemplate RowMapper 读取 postgres 表中的 jsonb 列
如何从1个表中选择许多行并将其插入另一个表中特定行的特定JSONB字段中?但是在单个原始SQL查询中