私自身も同様の問題に取り組んでいましたが、関数のオーバーヘッドは必要ありませんでした。私は次のクエリを思いついた:
SELECT myfield::integer FROM mytable WHERE myfield ~ E'^\\d+$';
Postgresはその条件をショートカットするので、::integerキャストにヒットする非整数を取得しないようにする必要があります。 NULL値も処理します(正規表現とは一致しません)。
選択しない代わりにゼロが必要な場合は、CASEステートメントが機能するはずです。
SELECT CASE WHEN myfield~E'^\\d+$' THEN myfield::integer ELSE 0 END FROM mytable;