Как преобразовать столбец таблицы в другой тип данных

У меня есть столбец с типом Varchar в моей базе данных Postgres, которая я означал быть целыми числами..., и теперь я хочу изменить их, к сожалению, это, кажется, не работает с помощью моей миграции направляющих.

change_column :table1, :columnB, :integer

Который, кажется, производит этот SQL:

ALTER TABLE table1 ALTER COLUMN columnB TYPE integer

Таким образом, я пытался делать это:

execute 'ALTER TABLE table1 ALTER COLUMN columnB TYPE integer USING CAST(columnB AS INTEGER)'

но бросок не работает в этом экземпляре, потому что часть столбца является пустой...

какие-либо идеи?

Ошибка:

PGError: ERROR:  invalid input syntax for integer: ""
: ALTER TABLE table1 ALTER COLUMN columnB TYPE integer USING CAST(columnB AS INTEGER)

Пост-ГРЭС v8.3

6
задан holden 21 May 2010 в 13:25
поделиться

2 ответа

Похоже, проблема в том, что в вашей таблице есть пустые строки. Вам нужно будет обработать их, возможно, с помощью оператора case, например:

execute% {ALTER TABLE "table1" ALTER COLUMN columnB TYPE integer USING CAST (CASE columnB WHEN '' THEN NULL ELSE columnB END AS INTEGER)}

Обновление: полностью переписано на основе обновленного вопроса.

13
ответ дан 8 December 2019 в 15:59
поделиться

NULL здесь не должно быть проблемой. Сообщите нам свою версию postgresql и сообщение об ошибке.Кроме того, зачем вы цитируете идентификаторы? Имейте в виду, что идентификаторы без кавычек преобразуются в нижний регистр (поведение по умолчанию), поэтому в вашем запросе может быть проблема с вашим "columnB" - он отображается первым в кавычках, без кавычек в приведении.

Обновление: перед преобразованием столбца в целое число необходимо убедиться, что все ваши значения конвертируемы. В этом случае это означает, что columnB должен содержать только цифры (или ноль). Вы можете проверить это, например,

  select columnB from table where not columnB ~ E'^[0-9]+$';

. Если вы хотите, чтобы ваши пустые строки были преобразованы в NULL целые числа, то сначала запустите

  UPDATE table set  columnB = NULL WHERE columnB = '';
2
ответ дан 8 December 2019 в 15:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: