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

Trunkering af visning som standard i postgres psql select-udsagn

Der er ingen måde med indbyggede muligheder for psql, som jeg ville kende til.
Du kan nå dit mål med en funktion som @Drazen foreslået - bare meget enklere :

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;

Opkaldseksempler:

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

SQL Fiddle.

Bemærkninger

  • Virker for alle tabel med kolonner af enhver datatype.

  • Dette bygger og udfører en forespørgsel af formen:

    SELECT "FoO_id", left(c_text, 11), left(c_vc, 11)::character varying
    FROM   "FoO";
    
  • Det forkorter kun kolonner med valgte datatyper og lader andre være i fred. Jeg inkluderede grundlæggende tegntyper:
    bpchar er det interne navn for character og alle varianter.
    varchar er det interne navn for character varying og alle varianter.
    Udvid til dine behov.

  • Funktionen returnerer originale kolonnenavne og datatyper for alle kolonner. Jeg kaster korte kolonner til text før fodring til left() , som returnerer text , så text kolonner behøver ikke en anden cast. Alle andre forkortede typer har brug for en tilbagestøbning til den oprindelige type. Nogle typer går i stykker, hvis du trunkerer! Så dette virker ikke for alle typer.

  • Du kan tilføje LIMIT n til funktionskaldet, men funktionen kan nemt udvides med en indbygget LIMIT - hvilket er meget mere effektiv for store tabeller, da forespørgslen inde i plpgsql-funktionen er planlagt uafhængigt.

  • Ydeevne er ikke meget værre end en almindelig SELECT * FROM tbl - bortset fra nævnte LIMIT tilfælde eller andre tilfælde, hvor du indlejrer funktionen. Sæt-returnerende PL/pgSQL-funktioner er generelt bedst ikke indlejrede:

  • Jeg har indbygget en standard max. længde på 25 tegn, send en brugerdefineret længde som 2. parameter eller tilpas standarden i funktionsoverskriften til dine behov.

  • Denne funktion er sikker mod mulige SQL-injektionsangreb via ondsindet udformede identifikatorer.

Relaterede svar med mere forklaring og links:

pgAdmin

... har den funktion du beder om, btw (for alle kolonner):



  1. Fejlfinding af SQL Server-transaktionelle replikeringsproblemer

  2. Barkers notation

  3. Opretter forbindelse til oracle 10g database via R

  4. Mysql-ressourcen er midlertidigt utilgængelig