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);
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 forcharacter
og alle varianter.varchar
er det interne navn forcharacter 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 tilleft()
, som returnerertext
, 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 indbyggetLIMIT
- 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ævnteLIMIT
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:
- Erstat tomme strenge med nulværdier
- Refaktorer en PL/pgSQL-funktion for at returnere output fra forskellige SELECT-forespørgsler
- Tabelnavn som en PostgreSQL funktionsparameter
- Postgres datatype cast
- Spørg efter skemadetaljerne for en tabel i PostgreSQL?
- Sådan kontrollerer du, om en tabel findes i et givet skema
pgAdmin
... har den funktion du beder om, btw (for alle kolonner):