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 docharactere todas as variantes.varcharé o nome interno paracharacter varyinge 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 paratextantes de alimentar paraleft(), que retornatext, entãotextcolunas 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 npara a chamada de função, mas a função pode ser facilmente estendida com umLIMITembutido - 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 ditoLIMITcase 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):