gpt4 book ai didi

sql - 为什么在使用 json 数据执行 sql 插入查询后,postgres 表在每一列中都显示 Null?

转载 作者:行者123 更新时间:2023-11-29 14:28:18 24 4
gpt4 key购买 nike

我正在尝试使用此查询将 json 数据插入到 postgres 表中-

INSERT INTO rf_dsgns 
SELECT * FROM json_populate_recordset(NULL::rf_dsgns,
'[
{
"Tracking_ID": 2377125,
"Constr_Zone": "Cleveland",
"AF_Name": "PbCleveland_10236716P",
"Address": "4755 1/2 Rose Avenue",
"Zip_Code": 44867,
"Latitude": 5.8923486,
"Longitude": -71.71052258,
},{
"Tracking_ID": 2377126,
"Constr_Zone": "Cleveland",
"AF_Name": "PggClevelandCLE_25236718P",
"Street_Address": "4413 1/3 Clain Avenue",
"Zip_Code": 44225,
"Latitude": 40.88960254,
"Longitude": -71.20898567,
}]');

我在创建表格时使用的数据类型分别是整数、字符、字符、字符、整数、数字、数字。我的建表脚本是

CREATE TABLE rf_dsgns
(
tracking_id integer,
constr_zone character(300),
af_name character(300),
address character(300),
zip_code integer,
latitude numeric,
longitude numeric
);

最佳答案

您很可能在创建表时未对列名使用双引号(这是一件好事)。但是,json_populate_recordset() 匹配区分大小写,因此表中的小写列名称与 JSON 中的混合大小写名称不匹配。

这个:

create table rf_dsgns ("Tracking_ID" int, "Constr_Zone" text, "AF_Name" text, "Address" text, "Zip_Code" text, "Latitude" numeric, "Longitude" numeric);

SELECT *
FROM json_populate_recordset(NULL::rf_dsgns,
'[
{
"Tracking_ID": 2377125,
"Constr_Zone": "Cleveland",
"AF_Name": "PbCleveland_10236716P",
"Address": "4755 1/2 Rose Avenue",
"Zip_Code": 44867,
"Latitude": 5.8923486,
"Longitude": -71.71052258
},{
"Tracking_ID": 2377126,
"Constr_Zone": "Cleveland",
"AF_Name": "PggClevelandCLE_25236718P",
"Street_Address": "4413 1/3 Clain Avenue",
"Zip_Code": 44225,
"Latitude": 40.88960254,
"Longitude": -71.20898567
}]');

返回:

Tracking_ID | Constr_Zone | AF_Name                   | Address              | Zip_Code | Latitude    | Longitude   
------------+-------------+---------------------------+----------------------+----------+-------------+-------------
2377125 | Cleveland | PbCleveland_10236716P | 4755 1/2 Rose Avenue | 44867 | 5.8923486 | -71.71052258
2377126 | Cleveland | PggClevelandCLE_25236718P | | 44225 | 40.88960254 | -71.20898567

但是当创建的表没有引号时:

create table rf_dsgns (tracking_id int, constr_zone text, af_name text, address text, zip_code text, latitude numeric, longitude numeric);

然后没有列匹配,所有内容都将是 NULL

不会使用区分大小写的列名称重新创建表。我可以看到两种解决方法:创建一个使用带引号的标识符但与表定义相同的新类型,并使用它来映射 JSON 数据。

改为使用 json_array_elements() 并手动拼出所有列名这需要更多的输入,但不会重复类型定义(实际上更灵活):

insert into rf_dsgns
SELECT (j ->> 'Tracking_ID')::int,
j ->> 'Constr_Zone',
j ->> 'AF_Name',
j ->> 'Addres',
j ->> 'Zip_Code',
(j ->> 'Latitude')::numeric,
(j ->> 'longitude')::numeric
FROM json_array_elements('.... your json here ') a t(j);

关于sql - 为什么在使用 json 数据执行 sql 插入查询后,postgres 表在每一列中都显示 Null?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55268410/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com