Ik worstelde zelf met een soortgelijk probleem, maar wilde geen overheadkosten van een functie. Ik kwam met de volgende vraag:
SELECT myfield::integer FROM mytable WHERE myfield ~ E'^\\d+$';
Postgres verkort zijn conditionals, dus je zou geen niet-gehele getallen moeten krijgen die je ::integer-cast raken. Het behandelt ook NULL-waarden (ze komen niet overeen met de regexp).
Als je nullen wilt in plaats van niet te selecteren, dan zou een CASE-statement moeten werken:
SELECT CASE WHEN myfield~E'^\\d+$' THEN myfield::integer ELSE 0 END FROM mytable;