Neexistuje žádný způsob s vestavěnými možnostmi psql, o kterých bych věděl.
Svého cíle můžete dosáhnout pomocí funkce jako @Drazen navrhl
- prostě mnohem jednodušší :
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;
Příklady volání:
SELECT * FROM f_trunc_columns(NULL::my_table);
SELECT * FROM f_trunc_columns(NULL::"MySchema"."My_funny_tbl", 11);
Poznámky
-
Funguje pro jakékoli tabulka se sloupci libovolných datový typ.
-
Tím se vytvoří a provede dotaz ve tvaru:
SELECT "FoO_id", left(c_text, 11), left(c_vc, 11)::character varying FROM "FoO";
-
Zkracuje pouze sloupce vybraných datových typů a ostatní nechává na pokoji. Zahrnul jsem základní typy znaků:
bpchar
je interní název procharacter
a všechny varianty.varchar
je interní název procharacter varying
a všechny varianty.
Rozšiřte podle svých potřeb. -
Funkce vrací původní názvy sloupců a datové typy pro všechny sloupce. Přenáším krátké sloupce do
text
před vložením doleft()
, který vrátítext
, tedytext
sloupce nepotřebují další obsazení. Všechny ostatní zkrácené typy potřebují odlitek zpět na původní typ. Některé typy se při zkrácení přeruší! Takže to nefunguje pro všechny typy. -
Můžete připojit
LIMIT n
k volání funkce, ale funkci lze snadno rozšířit pomocí vestavěnéhoLIMIT
- což je hodně efektivnější pro velké tabulky, protože dotaz uvnitř funkce plpgsql je plánován nezávisle. -
Výkon není o moc horší než obyčejný
SELECT * FROM tbl
- kromě uvedenéhoLIMIT
případ nebo jiné případy, kdy funkci vnoříte. Funkce PL/pgSQL vracející sadu je obecně nejlepší nevnořovat: -
Zabudoval jsem výchozí max. délku 25 znaků, předejte vlastní délku jako 2. parametr nebo přizpůsobte výchozí nastavení v záhlaví funkce svým potřebám.
-
Tato funkce je bezpečná proti možným útokům SQL injection prostřednictvím škodlivě vytvořených identifikátorů.
Související odpovědi s dalším vysvětlením a odkazy:
- Nahraďte prázdné řetězce hodnotami null
- Refaktorujte funkci PL/pgSQL tak, aby vrátila výstup různých SELECT dotazů
- Název tabulky jako Parametr funkce PostgreSQL
- Přenos datového typu Postgres
- Dotaz na podrobnosti schématu tabulky v PostgreSQL?
- Jak zkontrolovat, zda tabulka v daném schématu existuje
pgAdmin
... má funkci, kterou požadujete, mimo jiné (pro všechny sloupce):