Eu estava apenas lutando com um problema semelhante, mas não queria a sobrecarga de uma função. Cheguei à seguinte consulta:
SELECT myfield::integer FROM mytable WHERE myfield ~ E'^\\d+$';
Postgres atalhos seus condicionais, então você não deve obter nenhum número não inteiro atingindo seu ::integer cast. Ele também lida com valores NULL (eles não corresponderão ao regexp).
Se você deseja zeros em vez de não selecionar, uma instrução CASE deve funcionar:
SELECT CASE WHEN myfield~E'^\\d+$' THEN myfield::integer ELSE 0 END FROM mytable;