sql >> Base de Datos >  >> RDS >> PostgreSQL

Truncar la visualización de forma predeterminada en las declaraciones de selección de postgres psql

No hay forma con las opciones integradas de psql que yo sepa.
Puede lograr su objetivo con una función como @Drazen sugirió - simplemente mucho más simple :

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;

Ejemplos de llamadas:

SELECT * FROM f_trunc_columns(NULL::my_table);
SELECT * FROM f_trunc_columns(NULL::"MySchema"."My_funny_tbl", 11);

SQL Fiddle.

Notas

  • Funciona para cualquier tabla con columnas de any tipo de datos.

  • Esto construye y ejecuta una consulta de la forma:

    SELECT "FoO_id", left(c_text, 11), left(c_vc, 11)::character varying
    FROM   "FoO";
    
  • Acorta solo las columnas de los tipos de datos elegidos y deja las demás en paz. Incluí tipos de caracteres básicos:
    bpchar es el nombre interno de character y todas las variantes.
    varchar es el nombre interno de character varying y todas las variantes.
    Amplíe a sus necesidades.

  • La función devuelve nombres de columna originales y tipos de datos para todas las columnas. Lanzo columnas cortas a text antes de alimentar a left() , que devuelve text , entonces text las columnas no necesitan otro reparto. Todos los demás tipos abreviados necesitan una conversión al tipo original. ¡Algunos tipos se rompen si los truncas! Entonces esto no funciona para todos los tipos.

  • Puede agregar LIMIT n a la llamada de función, pero la función se puede extender fácilmente con un LIMIT incorporado - que es mucho más eficiente para tablas grandes, ya que la consulta dentro de la función plpgsql se planifica de forma independiente.

  • Rendimiento no es mucho peor que un simple SELECT * FROM tbl - excepto por dicho LIMIT case u otros casos en los que anida la función. Por lo general, es mejor no anidar las funciones PL/pgSQL que devuelven conjuntos:

  • Construí un máximo predeterminado. longitud de 25 caracteres, pase una longitud personalizada como segundo parámetro o adapte la predeterminada en el encabezado de la función a sus necesidades.

  • Esta función es segura contra posibles ataques de inyección SQL a través de identificadores creados con fines malintencionados.

Respuestas relacionadas con más explicaciones y enlaces:

pgAdmin

... tiene la función que está solicitando, por cierto (para todas las columnas):