Não há nenhuma maneira com opções internas do psql que eu conheça.
Você pode atingir seu objetivo com uma função como @Drazen sugerido - apenas muito mais simples :
CREATE OR REPLACE FUNCTION f_trunc_columns(_tbl anyelement, _len int = 25)
RETURNS SETOF anyelement AS
$func$
DECLARE
_typ CONSTANT regtype[] := '{bpchar, varchar}'; -- types to shorten
BEGIN
RETURN QUERY EXECUTE (
SELECT format('SELECT %s FROM %s'
, string_agg(CASE WHEN a.atttypid = 'text'::regtype -- simple case text
THEN format('left(%I, %s)', a.attname, _len)
WHEN a.atttypid = ANY(_typ) -- other short types
THEN format('left(%I::text, %s)::%s'
, a.attname, _len, format_type(a.atttypid, a.atttypmod))
ELSE quote_ident(a.attname) END -- rest
, ', ' ORDER BY a.attnum)
, pg_typeof(_tbl))
FROM pg_attribute a
WHERE a.attrelid = pg_typeof(_tbl)::text::regclass
AND NOT a.attisdropped -- no dropped (dead) columns
AND a.attnum > 0 -- no system columns
);
END
$func$ LANGUAGE plpgsql;
Exemplos de chamadas:
SELECT * FROM f_trunc_columns(NULL::my_table);
SELECT * FROM f_trunc_columns(NULL::"MySchema"."My_funny_tbl", 11);
SQL Fiddle.
Observações
-
Funciona para qualquer tabela com colunas de qualquer tipo de dados.
-
Isso cria e executa uma consulta no formato:
SELECT "FoO_id", left(c_text, 11), left(c_vc, 11)::character varying FROM "FoO";
-
Ele encurta apenas as colunas dos tipos de dados escolhidos e deixa os outros em paz. Incluí tipos básicos de caracteres:bpchar
é o nome interno docharacter
e todas as variantes.varchar
é o nome interno paracharacter varying
e todas as variantes.
Estenda de acordo com suas necessidades.
-
A função retorna nomes de colunas e tipos de dados originais para todas as colunas. Eu converto colunas curtas paratext
antes de alimentar paraleft()
, que retornatext
, entãotext
colunas não precisam de outro elenco. Todos os outros tipos abreviados precisam de uma conversão para o tipo original. Alguns tipos quebram se você truncar! Portanto, isso não funciona para todos os tipos.
-
Você pode anexarLIMIT n
para a chamada de função, mas a função pode ser facilmente estendida com umLIMIT
embutido - o que é muito mais eficiente para tabelas grandes, pois a consulta dentro da função plpgsql é planejada de forma independente.
-
Desempenho não é muito pior do que um simplesSELECT * FROM tbl
- exceto para o ditoLIMIT
case ou outros casos em que você aninha a função. As funções PL/pgSQL de retorno de conjunto geralmente são melhores não aninhadas:
-
Eu construí em um padrão max. comprimento de 25 caracteres, passe um comprimento personalizado como 2º parâmetro ou adapte o padrão no cabeçalho da função às suas necessidades.
-
Esta função é segura contra possíveis ataques de injeção de SQL por meio de identificadores criados com códigos maliciosos.
Respostas relacionadas com mais explicações e links:
- Substituir strings vazias por valores nulos
- Refatorar uma função PL/pgSQL para retornar a saída de várias consultas SELECT
- Nome da tabela como Parâmetro de função do PostgreSQL
- Conversão de tipo de dados Postgres
- Consultar os detalhes do esquema de uma tabela no PostgreSQL?
- Como verificar se existe uma tabela em um determinado esquema
pgAdmin
... tem o recurso que você está pedindo, btw (para todas as colunas):