PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Abschneiden der Anzeige standardmäßig in Postgres-Psql-Select-Anweisungen

Es gibt keine Möglichkeit mit eingebauten Optionen von psql, von denen ich wüsste.
Sie können Ihr Ziel mit einer Funktion wie @Drazen vorgeschlagen - nur viel einfacher :

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;

Aufrufbeispiele:

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

SQL-Fiddle.

Notizen

  • Funktioniert für alle Tabelle mit beliebigen Spalten Datentyp.

  • Dies erstellt und führt eine Abfrage der Form:

    aus
    SELECT "FoO_id", left(c_text, 11), left(c_vc, 11)::character varying
    FROM   "FoO";
    
  • Es verkürzt nur Spalten ausgewählter Datentypen und lässt andere in Ruhe. Ich habe grundlegende Zeichentypen eingefügt:
    bpchar ist der interne Name für character und alle Varianten.
    varchar ist der interne Name für character varying und alle Varianten.
    Erweitern Sie sich nach Ihren Wünschen.

  • Die Funktion gibt ursprüngliche Spaltennamen und Datentypen für alle Spalten zurück. Ich wandele kurze Spalten in text um vor dem Zuführen zu left() , die text zurückgibt , also text Spalten brauchen keinen weiteren Cast. Alle anderen verkürzten Typen müssen auf den ursprünglichen Typ zurückgesetzt werden. Einige Typen werden beim Abschneiden beschädigt! Das funktioniert also nicht bei allen Typen.

  • Sie können LIMIT n anhängen zum Funktionsaufruf, aber die Funktion kann leicht mit einem eingebauten LIMIT erweitert werden - was viel ist effizienter für große Tabellen, da die Abfrage innerhalb der plpgsql-Funktion unabhängig geplant wird.

  • Leistung ist nicht viel schlimmer als ein einfaches SELECT * FROM tbl - außer besagtem LIMIT case oder andere Fälle, in denen Sie die Funktion verschachteln. Set-zurückgebende PL/pgSQL-Funktionen sind im Allgemeinen am besten nicht verschachtelt:

  • Ich habe ein Standardmaximum eingebaut. Länge von 25 Zeichen, übergeben Sie eine benutzerdefinierte Länge als 2. Parameter oder passen Sie die Vorgabe im Funktionskopf an Ihre Bedürfnisse an.

  • Diese Funktion ist sicher gegen mögliche SQL-Injection-Angriffe über böswillig erstellte Kennungen.

Verwandte Antworten mit weiteren Erklärungen und Links:

pgAdmin

... hat die Funktion, nach der Sie fragen, übrigens (für alle Spalten):