Не совсем то, что вы спрашиваете, но то, что я думаю, будет работать лучше для вас.
Чтобы пройтись по всем столбцам, преобразуйте каждый в число, а затем приведите его к целому числу и верните max.:
SELECT MAX(regexp_replace(my_column, '[^0-9]', '', 'g')::int) FROM public.foobar;
Это дает вам максимальное значение ... скажем, 2999.
Теперь, продвигаясь вперед, рассмотрите возможность сделать значение по умолчанию для вашего столбца последовательным значением и преобразовать его в текст ... таким образом, вы один раз установили "MAX", а затем позволили postgres сделать всю работу для будущих значений. .
-- create simple integer sequence
CREATE SEQUENCE public.foobar_my_column_seq
INCREMENT 1
MINVALUE 1
MAXVALUE 9223372036854775807
START 1
CACHE 0;
-- use new sequence as default value for column __and__ convert to text
ALTER TABLE foobar
ALTER COLUMN my_column
SET DEFAULT nextval('publc.foobar_my_column_seq'::regclass)::text;
-- initialize "next value" of sequence to whatever is larger than
-- what you already have in your data ... say 3000:
ALTER SEQUENCE public.foobar_my_column_seq RESTART WITH 3000;
Поскольку вы просто устанавливаете значение по умолчанию, вы не меняете свои текущие буквенно-цифровые значения.