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);
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örcharacter
och alla varianter.varchar
är det interna namnet förcharacter 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 tillleft()
, som returnerartext
, 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 inbyggdLIMIT
- 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ämndaLIMIT
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:
- Ersätt tomma strängar med nullvärden
- Refaktorera en PL/pgSQL-funktion för att returnera utdata från olika SELECT-frågor
- Tabellnamn som en PostgreSQL funktionsparameter
- Postgres datatyp cast
- Fråga schemadetaljerna för en tabell i PostgreSQL?
- Hur man kontrollerar om en tabell finns i ett givet schema
pgAdmin
... har funktionen du efterfrågar, btw (för alla kolumner):