Подтвердить что ты не робот

Postgres Изменить таблицу для преобразования типа столбца из char в bigint

Возможный дубликат:
как изменить тип столбца столбца от символа до числового в postgresql 8.4

Если у меня есть поле типа varchar (и все значения являются нулевыми или строковыми представлениями чисел), как использовать таблицу alter для преобразования этого типа столбца в bigint?

4b9b3361

Ответ 1

Для преобразования просто путем разбора строки (кастинг):

alter table the_table alter column the_column type bigint using the_column::bigint

Фактически вы можете использовать любое выражение в терминах the_column вместо the_column::bigint для настройки преобразования.

Обратите внимание, что это перепишет таблицу, заблокировав даже читателей до ее завершения.

Ответ 2

Вы можете создать временный столбец типа bigint, а затем выполнить SQL как

UPDATE my_table SET bigint_column=varchar_column::bigint;

Затем оставьте свой varchar_column и переименуйте bigint_column. Это своего рода кольцевая разметка, но не требует специального приведения в postgres.

Ответ 3

Как преобразовать тип столбца строки в числовой или bigint в postgresql

Создайте свой собственный заказ из строки в bigint. Что-то вроде этого:

CREATE OR REPLACE FUNCTION convert_to_bigint(v_input text)
RETURNS BIGINT AS $$
DECLARE v_bigint_value BIGINT DEFAULT NULL;
BEGIN
    BEGIN
        v_bigint_value := v_input::BIGINT;
    EXCEPTION WHEN OTHERS THEN
        RAISE NOTICE 'Invalid bigint value: "%".  Returning something else.', v_input;
        RETURN 0;
    END;
RETURN v_bigint_value;
END;

Затем создайте новую таблицу fixed_table_with_bigint с теми же параметрами, что и для старой таблицы, за исключением изменения столбца строки в столбце bigint.

Затем вставьте все строки из предыдущей таблицы (используя пользовательский листинг convert_to_integer) в новую таблицу:

insert into fixed_table_with_bigint
select mycolumn1, 
       convert_to_bigint(your_string_bigint_column),
       mycolumn3
    from incorrect_table

Возможно, вам придется изменить convert_to_bigint, чтобы обрабатывать строки, которые не являются номерами, пустыми строками, нулями, управляющими символами и другой странностью.

Затем удалите первую таблицу и переименуйте вторую таблицу в качестве первой таблицы.