ฉันมีความต้องการแบบเดียวกันและพบว่าสิ่งนี้ใช้ได้ดีสำหรับฉัน (postgres 8.4):
CAST((COALESCE(myfield,'0')) AS INTEGER)
การทดสอบบางกรณีเพื่อแสดง:
db=> select CAST((COALESCE(NULL,'0')) AS INTEGER);
int4
------
0
(1 row)
db=> select CAST((COALESCE('','0')) AS INTEGER);
int4
------
0
(1 row)
db=> select CAST((COALESCE('4','0')) AS INTEGER);
int4
------
4
(1 row)
db=> select CAST((COALESCE('bad','0')) AS INTEGER);
ERROR: invalid input syntax for integer: "bad"
หากคุณต้องการจัดการกับความเป็นไปได้ของฟิลด์ที่มีข้อความที่ไม่ใช่ตัวเลข (เช่น "100bad") คุณสามารถใช้ regexp_replace เพื่อดึงอักขระที่ไม่ใช่ตัวเลขก่อนแคสต์
CAST(REGEXP_REPLACE(COALESCE(myfield,'0'), '[^0-9]+', '', 'g') AS INTEGER)
จากนั้นค่า text / varchar เช่น "b3ad5" จะให้ตัวเลขด้วย
db=> select CAST(REGEXP_REPLACE(COALESCE('b3ad5','0'), '[^0-9]+', '', 'g') AS INTEGER);
regexp_replace
----------------
35
(1 row)
เพื่อจัดการกับข้อกังวลของ Chris Cogdon เกี่ยวกับการแก้ปัญหาที่ไม่ให้ 0 สำหรับทุกกรณีรวมถึงกรณีเช่น "ไม่ดี" (ไม่มีอักขระหลักเลย) ฉันได้ปรับคำสั่งนี้:
CAST((COALESCE(NULLIF(REGEXP_REPLACE(myfield, '[^0-9]+', '', 'g'), ''), '0')) AS INTEGER);
ทำงานคล้ายกับโซลูชันที่ง่ายกว่ายกเว้นจะให้ 0 เมื่อค่าที่จะแปลงเป็นอักขระที่ไม่ใช่ตัวเลขเท่านั้นเช่น "ไม่ดี":
db=> select CAST((COALESCE(NULLIF(REGEXP_REPLACE('no longer bad!', '[^0-9]+', '', 'g'), ''), '0')) AS INTEGER);
coalesce
----------
0
(1 row)