ฉันใช้แบบสอบถามต่อไปนี้:
ALTER TABLE presales ALTER COLUMN code TYPE numeric(10,0);
หากต้องการเปลี่ยนประเภทข้อมูลของคอลัมน์จากcharacter(20)
เป็นnumeric(10,0)
แต่ฉันได้รับข้อผิดพลาด:
ไม่สามารถแคสต์คอลัมน์ "code" เพื่อพิมพ์ตัวเลขได้
ฉันใช้แบบสอบถามต่อไปนี้:
ALTER TABLE presales ALTER COLUMN code TYPE numeric(10,0);
หากต้องการเปลี่ยนประเภทข้อมูลของคอลัมน์จากcharacter(20)
เป็นnumeric(10,0)
แต่ฉันได้รับข้อผิดพลาด:
ไม่สามารถแคสต์คอลัมน์ "code" เพื่อพิมพ์ตัวเลขได้
คำตอบ:
คุณสามารถลองใช้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
ที่ไม่สามารถแปลงเป็นตัวเลขได้ หากการใช้ล้มเหลวคุณจะต้องล้างข้อมูลที่ไม่ใช่ตัวเลขด้วยมือก่อนที่จะเปลี่ยนประเภทคอลัมน์
TYPE varchar(255) USING (substring(formertextcolumn from 1 for 255))
หากVARCHAR
คอลัมน์ของคุณมีสตริงว่าง (ซึ่งไม่เหมือนกับNULL
PostgreSQL อย่างที่คุณอาจจำได้) คุณจะต้องใช้บางสิ่งในบรรทัดต่อไปนี้เพื่อตั้งค่าเริ่มต้น:
ALTER TABLE presales ALTER COLUMN code TYPE NUMERIC(10,0)
USING COALESCE(NULLIF(code, '')::NUMERIC, 0);
(พบด้วยความช่วยเหลือของคำตอบนี้ )
ขั้นตอนที่ 1: เพิ่มคอลัมน์ใหม่ด้วยจำนวนเต็มหรือตัวเลขตามความต้องการของคุณ
ขั้นตอนที่ 2: เติมข้อมูลจากคอลัมน์ varchar เป็นคอลัมน์ตัวเลข
ขั้นตอนที่ 3: วางคอลัมน์ varchar
ขั้นตอนที่ 4: เปลี่ยนชื่อคอลัมน์ตัวเลขใหม่ตามคอลัมน์ varchar เก่า