当前位置: 首页 > 面试题库 >

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

云霖
2023-03-14
问题内容

我试图在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数据插入表中。该查询成功完成,但是当我尝试查看表中的数据时,它只是一个管道。

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

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


问题答案:

首先,在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[])准备插入的对象(带有)。



 类似资料:
  • 问题内容: 我正在将数据插入MySQL数据库,以防万一如果插入失败,我需要给出一条适当的错误消息来指示。根据下面的代码,如果插入成功或失败,我将收到消息。 我要做的是仅在数据插入成功时才回显消息,如果失败则返回。我该如何修改我的代码? 问题答案:

  • 我是新使用PostgreSQL的,我正在尝试从spring jdbc插入值。这是我的问题 我的代码如下 当我为上述方法执行测试用例时,我得到的错误如下: 组织。springframework。jdbc。BadSqlGrammarException:StatementCallback;错误的SQL语法[插入卖家(卖家ID、名字、姓氏、锡号、公司名称、公司标识、EPCH号、VAT号、CST号、佣金、状

  • 我正在尝试使用mysqli函数将一些数据插入到表中。 我的连接使用以下功能可以正常工作: 但当我尝试运行insert函数时,数据库中什么也得不到。 我一直在查看mysqli函数列表,寻找正确的错误方法,但它们似乎都与DB的连接有关,而不是与插入成功有关(而且我可以在我的DB中清楚地看到它没有插入。) 最好的调试方法是什么?我应该对插入使用哪种错误处理? 我尝试使用mysqli_sqlstate,它

  • 问题内容: 我正在将数据有问题地插入表中。当我从另一个表执行此操作时,它很快,但如果有很多记录,则只会非常缓慢地放慢速度。即使那样,也只需要几秒钟。 当我从查询插入到表时,它需要花费几分钟的时间-大约每插入1000条记录需要一分钟。 源查询本身仅作为选择查询运行时,可能需要1-2秒。查询是否针对插入的每个记录运行?我希望它会在整个数据集中运行一次。还是有其他原因导致该函数与从另一个表插入“平面”数

  • 问题内容: 我有一个输出当前数据的现有查询,我想将其插入到Temp表中,但是这样做有一些问题。有人会对如何执行此操作有一些见解吗? 这是一个例子 这似乎当前以我需要的方式输出我的数据,但我想将其传递到临时表中。我的问题是我对SQL查询还很陌生,还没有找到一种方法来做到这一点。或者,即使有可能。如果不可能,是否有更好的方法将我要查找的数据获取到临时表中? 问题答案:

  • 我有一个输出当前数据的现有查询,我想将其插入到Temp表中,但这样做有一些问题。有人对如何做到这一点有一些见解吗? 这里有一个例子 这似乎以我需要的方式输出了我的数据,但我想将其传递到临时表中。我的问题是我对SQL查询很陌生,并且无法找到这样做的方法。或者如果可能的话。如果不可能,有没有更好的方法将我正在寻找的获取到临时表中?