一尘不染

成功将JSON数据插入到PostgreSQL查询中,但是输出是意外的

sql

我试图在PostgreSQL中的表中插入一些JSON数据。

JSON DATA:
{
 "wsgi.multiprocess": true,
 "HTTP_REFERER": "http://localhost:9000/"
}

因此,为此,我正在执行以下步骤:

CREATE TABLE TEST (MULTIPROCESS VARCHAR(20), HTTP_REFERER VARCHAR(50));

INSERT INTO TEST SELECT * FROM json_populate_record(NULL::test, '{"wsgi.multiprocess": true,"HTTP_REFERER": "http://localhost:9000/"}');

第一步创建一个表,而下一个步骤应将JSON数据插入表中。该查询成功完成,但是当我尝试查看表中的数据时,它只是一个管道。

这是输出: 在此处输入图片说明

有人知道为什么这样的输出吗?知道我应该怎么做才能纠正这个问题吗?


阅读 209

收藏
2021-03-08

共1个答案

一尘不染

首先,在postgresql中,如果您确实希望将字段名和表名都大写,则需要创建表,如下所示:

CREATE TABLE "TEST" ("MULTIPROCESS" VARCHAR(20), "HTTP_REFERER" VARCHAR(50));

然后查询将像:

SELECT * FROM json_populate_record(NULL::"TEST", '{"wsgi.multiprocess": true,"HTTP_REFERER": "http://localhost:9000/"}');

 MULTIPROCESS |      HTTP_REFERER      
--------------+------------------------
              | http://localhost:9000/

如您所见,由于json和sql表中的字段名称不匹配,因此multiprocess保留为空白。要摆脱这种情况,您可以执行外部脚本或postgresql函数。

例如:

CREATE OR REPLACE
  FUNCTION replace_json_keys(IN js TEXT) 
  RETURNS json 
  STABLE 
  AS
$$
BEGIN
  js := replace(js, '"wsgi.multiprocess"', '"MULTIPROCESS"');
  return js::json;
END;
$$ LANGUAGE 'plpgsql';

然后,您可以执行以下操作:

SELECT * FROM json_populate_record(NULL::"TEST", replace_json_keys('{"wsgi.multiprocess": true,"HTTP_REFERER": "http://localhost:9000/"}'));

 MULTIPROCESS |      HTTP_REFERER      
--------------+------------------------
 true         | http://localhost:9000/

但是,最好的解决方案不是使用replace()而是json_each()将键和值拆分为两个数组,使用“ case
when”进行循环以将json键映射到sql键,然后返回一个新的json。json_object(keys[], values[])准备插入的对象(带有)。

2021-03-08