Я использую следующий запрос:
ALTER TABLE presales ALTER COLUMN code TYPE numeric(10,0);
изменить тип данных столбца с character(20)
на, numeric(10,0)
но я получаю сообщение об ошибке:
столбец "код" не может быть приведен к числовому типу
Я использую следующий запрос:
ALTER TABLE presales ALTER COLUMN code TYPE numeric(10,0);
изменить тип данных столбца с character(20)
на, numeric(10,0)
но я получаю сообщение об ошибке:
столбец "код" не может быть приведен к числовому типу
Ответы:
Вы можете попробовать использовать USING
:
Необязательное
USING
предложение указывает, как вычислить новое значение столбца из старого; если опущено, преобразование по умолчанию такое же, как и при преобразовании из старого типа данных в новый. ПредложениеUSING
должно быть предоставлено, если не существует неявного или присвоения, приведенного от старого к новому типу.
Так что это может работать (в зависимости от ваших данных):
alter table presales alter column code type numeric(10,0) using code::numeric;
-- Or if you prefer standard casting...
alter table presales alter column code type numeric(10,0) using cast(code as numeric);
Это не удастся, если у вас есть что- code
то, что не может быть приведено к числовому типу; в случае сбоя ИСПОЛЬЗОВАНИЯ вам придется вручную очистить нечисловые данные перед изменением типа столбца.
TYPE varchar(255) USING (substring(formertextcolumn from 1 for 255))
Если VARCHAR
столбец содержит пустые строки (которые не так же , как NULL
для PostgreSQL , как вы помните) , вам придется использовать что - то в строке следующее , чтобы установить значение по умолчанию:
ALTER TABLE presales ALTER COLUMN code TYPE NUMERIC(10,0)
USING COALESCE(NULLIF(code, '')::NUMERIC, 0);
(найдено с помощью этого ответа )