Po prostu sam zmagałem się z podobnym problemem, ale nie chciałem obciążać funkcji. Wymyśliłem następujące zapytanie:
SELECT myfield::integer FROM mytable WHERE myfield ~ E'^\\d+$';
Postgres skraca swoje warunki warunkowe, więc nie powinieneś otrzymać żadnych liczb niecałkowitych uderzających w rzut ::integer. Obsługuje również wartości NULL (nie będą pasować do wyrażenia regularnego).
Jeśli chcesz zer zamiast nie wybierać, instrukcja CASE powinna działać:
SELECT CASE WHEN myfield~E'^\\d+$' THEN myfield::integer ELSE 0 END FROM mytable;