Es gibt keine Möglichkeit mit eingebauten Optionen von psql, von denen ich wüsste.
Sie können Ihr Ziel mit einer Funktion wie @Drazen vorgeschlagen
- nur viel einfacher :
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;
Aufrufbeispiele:
SELECT * FROM f_trunc_columns(NULL::my_table);
SELECT * FROM f_trunc_columns(NULL::"MySchema"."My_funny_tbl", 11);
Notizen
-
Funktioniert für alle Tabelle mit beliebigen Spalten Datentyp.
-
Dies erstellt und führt eine Abfrage der Form:
ausSELECT "FoO_id", left(c_text, 11), left(c_vc, 11)::character varying FROM "FoO";
-
Es verkürzt nur Spalten ausgewählter Datentypen und lässt andere in Ruhe. Ich habe grundlegende Zeichentypen eingefügt:
bpchar
ist der interne Name fürcharacter
und alle Varianten.varchar
ist der interne Name fürcharacter varying
und alle Varianten.
Erweitern Sie sich nach Ihren Wünschen. -
Die Funktion gibt ursprüngliche Spaltennamen und Datentypen für alle Spalten zurück. Ich wandele kurze Spalten in
text
um vor dem Zuführen zuleft()
, dietext
zurückgibt , alsotext
Spalten brauchen keinen weiteren Cast. Alle anderen verkürzten Typen müssen auf den ursprünglichen Typ zurückgesetzt werden. Einige Typen werden beim Abschneiden beschädigt! Das funktioniert also nicht bei allen Typen. -
Sie können
LIMIT n
anhängen zum Funktionsaufruf, aber die Funktion kann leicht mit einem eingebautenLIMIT
erweitert werden - was viel ist effizienter für große Tabellen, da die Abfrage innerhalb der plpgsql-Funktion unabhängig geplant wird. -
Leistung ist nicht viel schlimmer als ein einfaches
SELECT * FROM tbl
- außer besagtemLIMIT
case oder andere Fälle, in denen Sie die Funktion verschachteln. Set-zurückgebende PL/pgSQL-Funktionen sind im Allgemeinen am besten nicht verschachtelt: -
Ich habe ein Standardmaximum eingebaut. Länge von 25 Zeichen, übergeben Sie eine benutzerdefinierte Länge als 2. Parameter oder passen Sie die Vorgabe im Funktionskopf an Ihre Bedürfnisse an.
-
Diese Funktion ist sicher gegen mögliche SQL-Injection-Angriffe über böswillig erstellte Kennungen.
Verwandte Antworten mit weiteren Erklärungen und Links:
- Ersetzen Sie leere Zeichenfolgen durch Nullwerte
- Refaktorisieren Sie eine PL/pgSQL-Funktion, um die Ausgabe verschiedener SELECT-Abfragen zurückzugeben
- Tabellenname als PostgreSQL-Funktionsparameter
- Umwandlung des Postgres-Datentyps
- Schemadetails einer Tabelle in PostgreSQL abfragen?
- So überprüfen Sie, ob eine Tabelle in einem bestimmten Schema vorhanden ist
pgAdmin
... hat die Funktion, nach der Sie fragen, übrigens (für alle Spalten):