读取一个变量 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 列

变量替换查询postgres jsonb对象

如何从1个表中选择许多行并将其插入另一个表中特定行的特定JSONB字段中?但是在单个原始SQL查询中

读取 pyspark 数据框中的 jsonb 类型字段? [复制]

postgres 将 jsonb[] 更改为 jsonb

Postgres:查询多个jsonb字段