Jag brottades bara med ett liknande problem själv, men ville inte ha en funktion. Jag kom på följande fråga:
SELECT myfield::integer FROM mytable WHERE myfield ~ E'^\\d+$';
Postgres genvägar dess villkor, så du bör inte få några icke-heltal som träffar din ::integer cast. Den hanterar också NULL-värden (de matchar inte regexp).
Om du vill ha nollor istället för att inte välja, bör en CASE-sats fungera:
SELECT CASE WHEN myfield~E'^\\d+$' THEN myfield::integer ELSE 0 END FROM mytable;