Er is geen manier met ingebouwde opties van psql die ik zou kennen.
Je kunt je doel bereiken met een functie als @Drazen voorgesteld
- gewoon veel eenvoudiger :
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;
Bel voorbeelden:
SELECT * FROM f_trunc_columns(NULL::my_table);
SELECT * FROM f_trunc_columns(NULL::"MySchema"."My_funny_tbl", 11);
Opmerkingen
-
Werkt voor elke tabel met kolommen van elke gegevenstype.
-
Dit bouwt en voert een query uit van het formulier:
SELECT "FoO_id", left(c_text, 11), left(c_vc, 11)::character varying FROM "FoO";
-
Het verkort alleen kolommen van gekozen gegevenstypen en laat anderen met rust. Ik heb basistekentypes toegevoegd:
bpchar
is de interne naam voorcharacter
en alle varianten.varchar
is de interne naam voorcharacter varying
en alle varianten.
Uitbreiden naar uw behoeften. -
De functie retourneert originele kolomnamen en gegevenstypen voor alle kolommen. Ik cast korte kolommen naar
text
voor het voeren naarleft()
, dietext
. retourneert , dustext
kolommen hebben geen andere cast nodig. Alle andere ingekorte typen hebben een teruggieting nodig naar het oorspronkelijke type. Sommige typen breken af als je ze afkapt! Dit werkt dus niet voor alle typen. -
U kunt
LIMIT n
. toevoegen naar de functieaanroep, maar de functie kan eenvoudig worden uitgebreid met een ingebouwdeLIMIT
- dat is veel efficiënter voor grote tabellen, omdat de query binnen de plpgsql-functie onafhankelijk wordt gepland. -
Prestaties is niet veel erger dan een gewone
SELECT * FROM tbl
- behalve voor genoemdeLIMIT
case of andere gevallen waarin u de functie nest. Set-return PL/pgSQL-functies kunnen over het algemeen het beste niet genest worden: -
Ik heb een standaard max. lengte van 25 tekens, geef een aangepaste lengte door als 2e parameter of pas de standaard in de functiekop aan uw behoeften aan.
-
Deze functie is veilig tegen mogelijke SQL-injectie-aanvallen via kwaadwillig vervaardigde identifiers.
Gerelateerde antwoorden met meer uitleg en links:
- Vervang lege strings door null-waarden
- Refactor een PL/pgSQL-functie om de uitvoer van verschillende SELECT-query's te retourneren
- Tabelnaam als een PostgreSQL-functieparameter
- Gegoten Postgres-gegevenstype
- De schemadetails van een tabel opvragen in PostgreSQL?
- Hoe te controleren of een tabel in een bepaald schema bestaat
pgAdmin
... heeft de functie waar u om vraagt, btw (voor alle kolommen):