Saya sendiri baru saja bergulat dengan masalah yang sama, tetapi tidak ingin overhead suatu fungsi. Saya datang dengan pertanyaan berikut:
SELECT myfield::integer FROM mytable WHERE myfield ~ E'^\\d+$';
Postgres mempersingkat persyaratannya, jadi Anda seharusnya tidak mendapatkan non-bilangan bulat yang mengenai ::integer cast Anda. Ini juga menangani nilai NULL (tidak akan cocok dengan regexp).
Jika Anda menginginkan nol daripada tidak memilih, maka pernyataan CASE akan berfungsi:
SELECT CASE WHEN myfield~E'^\\d+$' THEN myfield::integer ELSE 0 END FROM mytable;