Я начинаю изучать sql в porstgresql. Я создал таблицу с числовой (6,2) структурой и пытаюсь импортировать данные. Но в данных есть строка со значением NULL. Теперь я получаю сообщение «ОШИБКА: неверный синтаксис ввода для числового типа: NULL». Теперь у меня есть как минимум 20 столбцов, содержащих это значение NULL.
Что мне делать в такой ситуации? Должен ли я изменить весь столбец вручную или можно сделать это автоматически для всего столбца?
CREATE TABLE ireland_income_gap_bonus (
id_c smallint,
companyName text, companies_ID smallint,
meanBonus numeric(6,2),
meanHourly numeric(6,2),
medianBonus numeric(6,2),
medianHourly numeric(6,2),
reportLink text,
year_ smallint,
meanHourlyPT numeric(6,2),
medianHourlyPT numeric(6,2),
meanHourlyTemp numeric(6,2),
medianHourlyTemp numeric(6,2),
perBonusFemale numeric(6,2),
perBonusMale numeric(6,2),
perBIKFemale numeric(6,2),
perBIKMale numeric(6,2),
pb1Female numeric(6,2),
pb1Male numeric(6,2),
pb2Female numeric(6,2),
pb2Male numeric(6,2),
pb3Female numeric(6,2),
pb3Male numeric(6,2),
pb4Female numeric(6,2),
pb4Male numeric(6,2),
perEmployeesFemale numeric(6,2),
perEmployeesMale numeric(6,2),
commentss text
)
Затем,
COPY ireland_income_gap_bonus
FROM 'E:\Programming\SQL\Project\Data\Ireland_gender_pays_gap\Ireland_gpg.CSV'
WITH (FORMAT CSV, HEADER)
Return messages,
ОШИБКА: неверный синтаксис ввода для числового типа: «NULL» КОНТЕКСТ: КОПИРОВАТЬ ireland_income_gap_bonus, строка 2, столбец «meanhourlypt»: «NULL»
Состояние SQL: 22P02
Похоже, что ваш CSV действительно содержит строку NULL. Эту строку, конечно, нельзя преобразовать в числовое значение. Если да, то ваша проблема в плохих данных. Вам необходимо очистить исходный файл. Нулевое значение в CSV-файле обычно представляется в виде последовательных запятых (,,).
Использование метакоманды psql
and it COPY
\copy
и параметра NULL
, описанного здесь КОПИРОВАТЬ:
cat test.csv
id,val
1,test
2,test2
3,null
create table csv_test (id integer, val varchar);
\copy csv_test from test.csv with csv header null 'null';
COPY 3
\pset null 'NULL'
Null display is "NULL".
select * from csv_test ;
id | val
----+-------
1 | test
2 | test2
3 | NULL
Проблема в том, что предполагается, что все значения NULL
представлены 'null'
. Если null
также представлен NULL
, пустой строкой без кавычек или каким-либо другим значением, они не будут преобразованы при импорте, как в:
cat test.csv
id,val
1,test
2,test2
3,null
4,NULL
\copy csv_test from test.csv with csv header null 'null';
COPY 4
\pset null 'REAL NULL'
Null display is "REAL NULL".
select * from csv_test ;
id | val
----+-----------
1 | test
2 | test2
3 | REAL NULL
4 | NULL
Чтобы рассматривать строку NULL
в CSV как нулевое значение, используйте опцию NULL 'null_string'
в COPY
(задокументировано здесь):
COPY ireland_income_gap_bonus
FROM 'E:\Programming\SQL\Project\Data\Ireland_gender_pays_gap\Ireland_gpg.CSV'
WITH (FORMAT CSV, HEADER, NULL 'NULL')
Используйте опцию NULL