Stavo solo lottando con un problema simile, ma non volevo il sovraccarico di una funzione. Mi è venuta la seguente domanda:
SELECT myfield::integer FROM mytable WHERE myfield ~ E'^\\d+$';
Postgres abbrevia i suoi condizionali, quindi non dovresti ottenere alcun numero non intero che colpisce il tuo cast ::integer. Gestisce anche i valori NULL (non corrisponderanno all'espressione regolare).
Se vuoi zeri invece di non selezionare, allora un'istruzione CASE dovrebbe funzionare:
SELECT CASE WHEN myfield~E'^\\d+$' THEN myfield::integer ELSE 0 END FROM mytable;