Tôi đang sử dụng truy vấn sau đây:
ALTER TABLE presales ALTER COLUMN code TYPE numeric(10,0);
để thay đổi kiểu dữ liệu của một cột từ character(20)
sang numeric(10,0)
nhưng tôi đang gặp lỗi:
cột "mã" không thể được đúc để nhập số
Tôi đang sử dụng truy vấn sau đây:
ALTER TABLE presales ALTER COLUMN code TYPE numeric(10,0);
để thay đổi kiểu dữ liệu của một cột từ character(20)
sang numeric(10,0)
nhưng tôi đang gặp lỗi:
cột "mã" không thể được đúc để nhập số
Câu trả lời:
Bạn có thể thử sử dụng USING
:
USING
Mệnh đề tùy chọn chỉ định cách tính giá trị cột mới từ giá trị cũ; nếu bị bỏ qua, chuyển đổi mặc định giống như một phép gán được chuyển từ kiểu dữ liệu cũ sang mới. MộtUSING
mệnh đề phải được cung cấp nếu không có hàm ẩn hoặc gán từ loại cũ sang loại mới.
Vì vậy, điều này có thể hoạt động (tùy thuộc vào dữ liệu của bạn):
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);
Điều này sẽ thất bại nếu bạn có bất cứ thứ gì trong code
đó không thể chuyển thành số; nếu SỬ DỤNG thất bại, bạn sẽ phải dọn sạch dữ liệu không phải là số trước khi thay đổi loại cột.
TYPE varchar(255) USING (substring(formertextcolumn from 1 for 255))
Nếu VARCHAR
cột của bạn chứa các chuỗi trống ( không giống NULL
với PostgreSQL như bạn có thể nhớ lại), bạn sẽ phải sử dụng một cái gì đó trong dòng sau đây để đặt mặc định:
ALTER TABLE presales ALTER COLUMN code TYPE NUMERIC(10,0)
USING COALESCE(NULLIF(code, '')::NUMERIC, 0);
(tìm thấy với sự giúp đỡ của câu trả lời này )