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ů:
bpcharje interní název procharactera všechny varianty.varcharje interní název procharacter varyinga 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
textpřed vložením doleft(), který vrátítext, tedytextsloupce 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 nk 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éhoLIMITpří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):
