Saya mempunyai kebutuhan yang sama dan merasa ini bekerja dengan baik untuk saya (postgres 8.4):
CAST((COALESCE(myfield,'0')) AS INTEGER)
Beberapa kasus uji untuk menunjukkan:
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"
Jika Anda perlu menangani kemungkinan bidang memiliki teks non-numerik (seperti "100bad"), Anda dapat menggunakan regexp_replace untuk menghapus karakter non-numerik sebelum pemeran.
CAST(REGEXP_REPLACE(COALESCE(myfield,'0'), '[^0-9]+', '', 'g') AS INTEGER)
Kemudian nilai teks / varchar seperti "b3ad5" juga akan memberikan angka
db=> select CAST(REGEXP_REPLACE(COALESCE('b3ad5','0'), '[^0-9]+', '', 'g') AS INTEGER);
regexp_replace
----------------
35
(1 row)
Untuk mengatasi kekhawatiran Chris Cogdon dengan solusi tidak memberikan 0 untuk semua kasus, termasuk kasus seperti "buruk" (tidak ada karakter digit sama sekali), saya membuat pernyataan yang disesuaikan ini:
CAST((COALESCE(NULLIF(REGEXP_REPLACE(myfield, '[^0-9]+', '', 'g'), ''), '0')) AS INTEGER);
Ini berfungsi mirip dengan solusi yang lebih sederhana, kecuali akan memberikan 0 ketika nilai untuk dikonversi adalah karakter non-digit saja, seperti "buruk":
db=> select CAST((COALESCE(NULLIF(REGEXP_REPLACE('no longer bad!', '[^0-9]+', '', 'g'), ''), '0')) AS INTEGER);
coalesce
----------
0
(1 row)