Ich habe gerade selbst mit einem ähnlichen Problem gekämpft, wollte aber nicht den Overhead einer Funktion. Ich kam mit der folgenden Abfrage:
SELECT myfield::integer FROM mytable WHERE myfield ~ E'^\\d+$';
Postgres verkürzt seine Bedingungen, sodass Sie keine Nicht-Ganzzahlen erhalten sollten, die Ihren ::integer Cast treffen. Es verarbeitet auch NULL-Werte (sie passen nicht zum regulären Ausdruck).
Wenn Sie Nullen wollen, anstatt nichts auszuwählen, dann sollte eine CASE-Anweisung funktionieren:
SELECT CASE WHEN myfield~E'^\\d+$' THEN myfield::integer ELSE 0 END FROM mytable;