Jeg kæmpede bare selv med et lignende problem, men ville ikke have overheadet til en funktion. Jeg kom op med følgende forespørgsel:
SELECT myfield::integer FROM mytable WHERE myfield ~ E'^\\d+$';
Postgres genvejer dets betingelser, så du bør ikke få nogen ikke-heltal, der rammer din ::integer cast. Det håndterer også NULL-værdier (de matcher ikke regexp).
Hvis du vil have nuller i stedet for ikke at vælge, så burde en CASE-sætning virke:
SELECT CASE WHEN myfield~E'^\\d+$' THEN myfield::integer ELSE 0 END FROM mytable;