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:
bpcharer det interne navn forcharacterog alle varianter.varcharer det interne navn forcharacter varyingog alle varianter.
Udvid til dine behov. -
Funktionen returnerer originale kolonnenavne og datatyper for alle kolonner. Jeg kaster korte kolonner til
textfør fodring tilleft(), som returnerertext, såtextkolonner 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 ntil 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ævnteLIMITtilfæ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):
