Yo mismo estaba luchando con un problema similar, pero no quería los gastos generales de una función. Se me ocurrió la siguiente consulta:
SELECT myfield::integer FROM mytable WHERE myfield ~ E'^\\d+$';
Postgres abrevia sus condicionales, por lo que no debería obtener números que no sean enteros golpeando su elenco de ::enteros. También maneja valores NULL (no coincidirán con la expresión regular).
Si desea ceros en lugar de no seleccionar, entonces una instrucción CASE debería funcionar:
SELECT CASE WHEN myfield~E'^\\d+$' THEN myfield::integer ELSE 0 END FROM mytable;