PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Truncando a exibição por padrão em instruções postgres psql select


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 do character e todas as variantes.
    varchar é o nome interno para character 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 para text antes de alimentar para left() , que retorna text , então text 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 anexar LIMIT n para a chamada de função, mas a função pode ser facilmente estendida com um LIMIT 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 simples SELECT * FROM tbl - exceto para o dito LIMIT 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:

pgAdmin


... tem o recurso que você está pedindo, btw (para todas as colunas):