Почему в таблице postgres отображается Null в каждом столбце после выполнения запроса вставки sql с данными json? - PullRequest
0 голосов
/ 20 марта 2019

Я пытаюсь вставить данные 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       
);

1 Ответ

2 голосов
/ 20 марта 2019

Скорее всего, вы создаете таблицу без использования двойных кавычек для имен столбцов (что хорошо).Однако json_populate_recordset() соответствует регистрозависимому, и поэтому имена столбцов в нижнем регистре в таблице не совпадают с именами смешанных регистров в JSON.

This:

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);
...