sql >> Databáze >  >> RDS >> PostgreSQL

Zkrácení zobrazení ve výchozím nastavení v příkazech postgres psql select

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);

SQL Fiddle.

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 pro character a všechny varianty.
    varchar je interní název pro character 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 do left() , který vrátí text , tedy text 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ého LIMIT - 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ého LIMIT 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:

pgAdmin

... má funkci, kterou požadujete, mimo jiné (pro všechny sloupce):



  1. Dotaz Rails .where() nefunguje

  2. jak vygenerovat plán vysvětlení pro celou uloženou proceduru

  3. Oracle WITH a MATERIALIZE hint funguje jako autonomní transakce pro funkce

  4. Jak Zend\Db v ZF2 řídí transakce?