Je luttais moi-même avec un problème similaire, mais je ne voulais pas la surcharge d'une fonction. J'ai trouvé la requête suivante :
SELECT myfield::integer FROM mytable WHERE myfield ~ E'^\\d+$';
Postgres raccourcit ses conditions, vous ne devriez donc pas avoir de non-entiers frappant votre ::integer cast. Il gère également les valeurs NULL (elles ne correspondent pas à l'expression régulière).
Si vous voulez des zéros au lieu de ne pas sélectionner, alors une instruction CASE devrait fonctionner :
SELECT CASE WHEN myfield~E'^\\d+$' THEN myfield::integer ELSE 0 END FROM mytable;