【问题标题】:How to return json key as INT and values (array) as an array in postgresql如何在postgresql中将json键作为INT和值(数组)作为数组返回
【发布时间】:2021-05-14 01:06:12
【问题描述】:

我创建了一个 json 变量 VDN 就像这样

{"80001": ["6", "9"], "80002": ["2", "6", "10"], "80004": ["4", "10", "8"]}

我创建了一个表,其中键和值在两个不同的列中分隔为 Varchar

drop function if exists aa_Dev.VDN();
CREATE OR REPLACE FUNCTION aa_dev.VDN()
  RETURNS VOID AS
$$

begin

    DROP TABLE IF EXISTS aa_dev.sdg_vdn;

    CREATE TABLE IF NOT EXISTS aa_dev.sdg_vdn (
        VDN VARCHAR,
        skills VARCHAR
    );

    INSERT INTO aa_dev.sdg_vdn(VDN, skills)
    select t.*
    from aa_dev.sdg_metadata m
    cross join json_each_text(m.VDN) as t(VDN, "values");
      

   
end

$$
LANGUAGE plpgsql;

所以我想要的数据类型应该是现在而不是 varchar

CREATE TABLE IF NOT EXISTS aa_dev.sdg_vdn (
    VDN INT,
    skills INT[]
);

如何在 PostgreSQL 中做到这一点?我曾尝试使用 json_populate_record 而不是 json_each_text,因为它可以返回任何数据类型,但这也不起作用。

【问题讨论】:

  • 不相关,但是:每次调用函数时创建一个新表并不是一个好主意。

标签: sql json postgresql plpgsql


【解决方案1】:

您需要一个多步骤方法:首先从 JSON 中提取所有键/值对,然后将其转换回 JSONB 值,然后再将其转换为记录类型:

insert into sdg_vdn (vdn, skills)
select (jsonb_populate_record(null::sdg_vdn, to_jsonb(t))).*
from jsonb_each('{"80001": ["6", "9"], "80002": ["2", "6", "10"], "80004": ["4", "10", "8"]}'::jsonb) as t(vdn, skills)

使用to_jsonb(t) 的中间步骤是将jsonb_each() 返回的键/值对转换回单个 JSON 值所必需的 - 然后可以将其转换为目标表的记录类型。 (...).* 是提取该记录的列所必需的。

Online example

【讨论】:

  • 为什么要把json转成jsonb?
  • @Chloe:我不是。我正在将 row (有两列)转换回单个 json 值。 (我解释说:“中间步骤使用 to_jsonb() ...
  • 我还想直接从另一个表中引用 json 变量,而不是将其硬编码为字符串。从 jsonb_each(aa_dev.sdg_metadata.vdns::jsonb) 作为 t(vdn, 技能);但它给出了错误 ERROR: missing FROM-clause entry for table "sdg_metadata"
猜你喜欢
  • 2019-01-27
  • 1970-01-01
  • 1970-01-01
  • 2019-11-26
  • 1970-01-01
  • 1970-01-01
  • 2014-07-23
  • 2019-04-25
  • 2017-01-20
相关资源
最近更新 更多