Używam następującego zapytania:
ALTER TABLE presales ALTER COLUMN code TYPE numeric(10,0);
aby zmienić typ danych kolumny z character(20)
na, numeric(10,0)
ale otrzymuję błąd:
kolumna „kod” nie może być rzutowana na typ liczbowy
Używam następującego zapytania:
ALTER TABLE presales ALTER COLUMN code TYPE numeric(10,0);
aby zmienić typ danych kolumny z character(20)
na, numeric(10,0)
ale otrzymuję błąd:
kolumna „kod” nie może być rzutowana na typ liczbowy
Odpowiedzi:
Możesz spróbować użyć USING
:
Opcjonalna
USING
klauzula określa, jak obliczyć nową wartość kolumny na podstawie starej; jeśli zostanie pominięty, domyślna konwersja jest taka sama, jak rzutowanie przypisania ze starego typu danych na nowy.USING
Klauzula musi być zapewnione, jeśli nie ma niejawny lub cesja odlewane ze starego do nowego typu.
Więc to może zadziałać (w zależności od twoich danych):
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);
To się nie powiedzie, jeśli masz coś code
, czego nie można rzucić na numeryczne; jeśli USING nie powiedzie się, będziesz musiał ręcznie wyczyścić dane nienumeryczne przed zmianą typu kolumny.
TYPE varchar(255) USING (substring(formertextcolumn from 1 for 255))
Jeśli twoja VARCHAR
kolumna zawiera puste łańcuchy (które nie są takie same jak NULL
dla PostgreSQL, jak być może pamiętasz), będziesz musiał użyć czegoś w linii poniżej, aby ustawić wartość domyślną:
ALTER TABLE presales ALTER COLUMN code TYPE NUMERIC(10,0)
USING COALESCE(NULLIF(code, '')::NUMERIC, 0);
(znalezione za pomocą tej odpowiedzi )