PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Troncamento della visualizzazione per impostazione predefinita nelle istruzioni select di postgres psql

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);

SQL Fiddle.

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 per character e tutte le varianti.
    varchar è il nome interno per character 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 a left() , che restituisce text , quindi text 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 un LIMIT 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 detto LIMIT 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:

pgAdmin

... ha la funzione che stai chiedendo, tra l'altro (per tutte le colonne):