As per @a_horse_with_no_name's comment: PostgreSQL doesn't offer a built-in function like that, but it's pretty simple to make one in PL/pgSQL yourself.
CREATE OR replace FUNCTION to_number(
argument text,
default_result integer default -1)
RETURNS integer LANGUAGE plpgsql
AS $$
BEGIN
RETURN argument::integer;
EXCEPTION WHEN OTHERS THEN
RETURN default_result;
END $$;
or, even in plain SQL - as suggested by Vaibhav Parab's comment
CREATE OR replace FUNCTION to_number(argument text,default_result integer default -1)
RETURNS integer LANGUAGE SQL
AS '
SELECT CASE
WHEN argument~E''^\\d+$''
THEN argument::integer
ELSE default_result
END';
Now you can call either by select to_number('b', default_result=>-1);
. The language sql
function variant does not impose any additional overhead compared to typing out the entire case
directly because it meets all the inlining criteria so it performs the same while being shorter.
Here's a working DB<>fiddle.