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);
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 decharacter
y todas las variantes.varchar
es el nombre interno decharacter 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 aleft()
, que devuelvetext
, entoncestext
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 unLIMIT
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 dichoLIMIT
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:
- Reemplazar cadenas vacías con valores nulos
- Refactorizar una función PL/pgSQL para devolver el resultado de varias consultas SELECT
- Nombre de tabla como Parámetro de función de PostgreSQL
- Transmisión de tipos de datos de Postgres
- ¿Consultar los detalles del esquema de una tabla en PostgreSQL?
- Cómo comprobar si existe una tabla en un esquema determinado
pgAdmin
... tiene la función que está solicitando, por cierto (para todas las columnas):