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örcharacteroch alla varianter.varcharär det interna namnet förcharacter varyingoch alla varianter.
Utöka efter dina behov. -
Funktionen returnerar ursprungliga kolumnnamn och datatyper för alla kolumner. Jag kastar korta kolumner till
textinnan matning tillleft(), som returnerartext, alltsåtextkolumner 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 ntill 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ämndaLIMITfall 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):
