sql >> Databasteknik >  >> RDS >> PostgreSQL

Trunkering visas som standard i postgres psql select-satser

Det finns inget sätt med inbyggda alternativ för psql som jag skulle känna till.
Du kan uppnå ditt mål med en funktion som @Drazen föreslog – bara mycket enklare :

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;

Samtalsexempel:

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

SQL-fiol.

Anteckningar

  • Fungerar för alla tabell med kolumner av alla datatyp.

  • Detta bygger och kör en fråga i formen:

    SELECT "FoO_id", left(c_text, 11), left(c_vc, 11)::character varying
    FROM   "FoO";
    
  • Det förkortar endast kolumner med valda datatyper och lämnar andra ifred. Jag inkluderade grundläggande teckentyper:
    bpchar är det interna namnet för character och alla varianter.
    varchar är det interna namnet för character varying och alla varianter.
    Utöka efter dina behov.

  • Funktionen returnerar ursprungliga kolumnnamn och datatyper för alla kolumner. Jag kastar korta kolumner till text innan matning till left() , som returnerar text , alltså text kolumner behöver inte en annan roll. Alla andra förkortade typer behöver en gjutning tillbaka till originaltypen. Vissa typer går sönder om du trunkerar! Så det här fungerar inte för alla typer.

  • Du kan lägga till LIMIT n till funktionsanropet, men funktionen kan enkelt utökas med en inbyggd LIMIT - vilket är mycket mer effektivt för stora tabeller, eftersom frågan inuti plpgsql-funktionen planeras oberoende.

  • Prestanda är inte mycket värre än en vanlig SELECT * FROM tbl - förutom nämnda LIMIT fall eller andra fall där du kapslar funktionen. Set-returnerande PL/pgSQL-funktioner är i allmänhet bäst att inte kapsla:

  • Jag byggde in ett standard max. längd på 25 tecken, skicka en anpassad längd som andra parameter eller anpassa standarden i funktionshuvudet efter dina behov.

  • Denna funktion är säker mot eventuella SQL-injektionsattacker via skadligt skapade identifierare.

Relaterade svar med mer förklaring och länkar:

pgAdmin

... har funktionen du efterfrågar, btw (för alla kolumner):



  1. Garanterar SQL Server sekventiell infogning av en identitetskolumn?

  2. Hur man visar sorteringen av en kolumn i MySQL

  3. Använda ett alias i SQL-beräkningar

  4. Allvarligt fel:Array-återuppringning måste innehålla index 0 och 1