Non c'è modo con le opzioni integrate di psql che io sappia.
Puoi raggiungere il tuo obiettivo con una funzione come Suggerito da @Drazen
- solo molto più semplice :
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;
Esempi di chiamate:
SELECT * FROM f_trunc_columns(NULL::my_table);
SELECT * FROM f_trunc_columns(NULL::"MySchema"."My_funny_tbl", 11);
Note
-
Funziona per qualsiasi tabella con colonne di qualsiasi tipo di dati.
-
Questo compila ed esegue una query del modulo:
SELECT "FoO_id", left(c_text, 11), left(c_vc, 11)::character varying FROM "FoO";
-
Accorcia solo le colonne dei tipi di dati scelti e lascia in pace gli altri. Ho incluso i tipi di caratteri di base:
bpchar
è il nome interno percharacter
e tutte le varianti.varchar
è il nome interno percharacter varying
e tutte le varianti.
Estendi in base alle tue esigenze. -
La funzione restituisce i nomi delle colonne ei tipi di dati originali per tutte le colonne. Trasmetto brevi colonne a
text
prima di passare aleft()
, che restituiscetext
, quinditext
le colonne non hanno bisogno di un altro cast. Tutti gli altri tipi abbreviati necessitano di un cast per tornare al tipo originale. Alcuni tipi si rompono se tronchi! Quindi questo non funziona per tutti i tipi. -
Puoi aggiungere
LIMIT n
alla chiamata di funzione, ma la funzione può essere facilmente estesa con unLIMIT
integrato - che è molto più efficiente per grandi tabelle, poiché la query all'interno della funzione plpgsql è pianificata in modo indipendente. -
Prestazioni non è molto peggio di un semplice
SELECT * FROM tbl
- ad eccezione di dettoLIMIT
case o altri casi in cui si annida la funzione. Le funzioni PL/pgSQL per la restituzione di set sono generalmente meglio non nidificate: -
Ho integrato un valore massimo predefinito. lunghezza di 25 caratteri, passa una lunghezza personalizzata come 2° parametro o adatta l'impostazione predefinita nell'intestazione della funzione alle tue esigenze.
-
Questa funzione è sicura contro possibili attacchi SQL injection tramite identificatori dannosi.
Risposte correlate con ulteriori spiegazioni e link:
- Sostituisci le stringhe vuote con valori null
- Refactoring di una funzione PL/pgSQL per restituire l'output di varie query SELECT
- Nome tabella come Parametro della funzione PostgreSQL
- Cast del tipo di dati Postgres
- Interrogare i dettagli dello schema di una tabella in PostgreSQL?
- Come verificare se esiste una tabella in un determinato schema
pgAdmin
... ha la funzione che stai chiedendo, tra l'altro (per tutte le colonne):