Aynı ihtiyacım vardı ve bunun benim için işe yaradığını buldum (postgres 8.4):
CAST((COALESCE(myfield,'0')) AS INTEGER)
Gösterilecek bazı test senaryoları:
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"
Alanın sayısal olmayan metne ("100bad" gibi) sahip olma olasılığını halletmeniz gerekiyorsa, çevrimden önce sayısal olmayan karakterleri çıkarmak için regexp_replace'i kullanabilirsiniz.
CAST(REGEXP_REPLACE(COALESCE(myfield,'0'), '[^0-9]+', '', 'g') AS INTEGER)
Sonra "b3ad5" gibi metin / varchar değerleri de sayılar verecektir
db=> select CAST(REGEXP_REPLACE(COALESCE('b3ad5','0'), '[^0-9]+', '', 'g') AS INTEGER);
regexp_replace
----------------
35
(1 row)
Chris Cogdon'ın, "kötü" gibi bir durum da dahil olmak üzere tüm durumlar için 0 vermemesi konusundaki endişesini gidermek için (hiç rakam karakteri yok), bu düzeltilmiş ifadeyi yaptım:
CAST((COALESCE(NULLIF(REGEXP_REPLACE(myfield, '[^0-9]+', '', 'g'), ''), '0')) AS INTEGER);
Daha basit çözümlere benzer şekilde çalışır, ancak dönüştürülecek değer yalnızca "kötü" gibi rakam olmayan karakterler olduğunda 0 verir:
db=> select CAST((COALESCE(NULLIF(REGEXP_REPLACE('no longer bad!', '[^0-9]+', '', 'g'), ''), '0')) AS INTEGER);
coalesce
----------
0
(1 row)