Как изменить тип столбца столбца с символа на числовой в PostgreSQL 8.4

Я использую следующий запрос:

ALTER TABLE presales ALTER COLUMN code TYPE numeric(10,0); 

чтобы изменить тип данных столбца от character(20) до numeric(10,0), но я получаю сообщение об ошибке:

"код" столбца не может быть введен для ввода числового

Ответ 1

Вы можете попробовать 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, которое нельзя отнести к числовому; если ИСПОЛЬЗОВАНИЕ завершается с ошибкой, вам необходимо очистить нечисловые данные вручную, прежде чем изменять тип столбца.

Ответ 2

Если ваш столбец VARCHAR содержит пустые строки (которые не совпадают с NULL для PostgreSQL, как вы могли бы вспомнить), вам нужно будет использовать что-то в строке ниже для установки значения по умолчанию:

ALTER TABLE presales ALTER COLUMN code TYPE NUMERIC(10,0)
            USING COALESCE(NULLIF(code, '')::NUMERIC, 0);

(найденный с помощью этого ответа)