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

标签 sql json postgresql null sql-insert

我正在尝试使用此查询将 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/

相关文章:

c# - IQueryable 不包含 SingleOrDefault 的定义

javascript - 使用 AngularJS 在 JSON URL 中显示数据

sql - 在 PostgreSQL 的一行中显示一列的多个值

java - postgresql 的 Hibernate 映射问题

mysql - 使用 GROUP BY 将查询从 MySQL 转换为 Postgres 和 SQLite

sql - 确定自引用表中组的排名

MySQL 找到在 2 个部门中赚最多钱的员工

mysql - MySQL 中何时使用单引号、双引号和反引号

json - 为自引用 Ecto 模型构建 JSON 映射

json - 为什么我的 CloudFormation 命令失败?