Аз самият просто се борех с подобен проблем, но не исках режийните разходи за функция. Получих следната заявка:
SELECT myfield::integer FROM mytable WHERE myfield ~ E'^\\d+$';
Postgres съкращава своите условия, така че не трябва да получавате никакви нецели числа, удрящи вашето ::integer cast. Той също така обработва NULL стойности (те няма да съвпадат с регулярния израз).
Ако искате нули, вместо да не избирате, тогава изразът CASE трябва да работи:
SELECT CASE WHEN myfield~E'^\\d+$' THEN myfield::integer ELSE 0 END FROM mytable;