Sám jsem zrovna zápasil s podobným problémem, ale nechtěl jsem režii funkce. Přišel jsem s následujícím dotazem:
SELECT myfield::integer FROM mytable WHERE myfield ~ E'^\\d+$';
Postgres zkracuje své podmínky, takže byste neměli dostat žádná jiná než celá čísla, která zasahují do vašeho ::integer obsazení. Zpracovává také hodnoty NULL (nebudou odpovídat regulárnímu výrazu).
Pokud chcete nuly místo nevybírání, pak by měl fungovat příkaz CASE:
SELECT CASE WHEN myfield~E'^\\d+$' THEN myfield::integer ELSE 0 END FROM mytable;