Вам нужны какие-то динамические c SQL для подобных вопросов. Но в Postgres это может быть сделано без необходимости использования функции PL / pg SQL, аналогично подходу из этого ответа , но с комбинированием max () и length ():
with all_lengths as (
select table_schema, table_name, column_name,
query_to_xml(format('select max(length(%I)) from %I.%I', column_name, table_schema, table_name), false, true, '') as xml_max
from information_schema.columns
where table_schema in ('public') -- add the schemas you want here
and data_type in ('text', 'character varying')
)
select table_schema, table_name, column_name,
(xpath('/row/max/text()', xml_max))[1]::text::int as max_length
from all_lengths
;
У меня нет Postgres 9.5, но я думаю, что это должно работать и с этой старой версией.
Если вы просто хотите указать c столбцы, а не все столбцы с текст или тип varchar, затем просто измените условие and data_type in (..)
на and column_name in (...)
внутри CTE