Это костыль, но работать будет
SELECT CASE WHEN some_field~E'^\\d+$' THEN some_field::integer ELSE 0 END FROM some_table;
Если прав в БД достаточно, то можно определить своё правило приведения типов:
CREATE OR REPLACE FUNCTION cast_to_int(text) RETURNS integer AS $$
BEGIN
RETURN CAST($1::varchar AS integer);
EXCEPTION
WHEN invalid_text_representation THEN
RETURN 0;
END;
$$ LANGUAGE plpgsql IMMUTABLE;
CREATE CAST (text as integer) WITH FUNCTION cast_to_int(text);
SELECT CAST('asd'::text as integer)
вернёт 0