sql >> Database >  >> RDS >> PostgreSQL

Standaard weergave inkorten in postgres psql select-instructies

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

SQL Fiddle.

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 voor character en alle varianten.
    varchar is de interne naam voor character 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 naar left() , die text . retourneert , dus text 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 ingebouwde LIMIT - 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 genoemde LIMIT 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:

pgAdmin

... heeft de functie waar u om vraagt, btw (voor alle kolommen):



  1. Hoe INNER JOIN 3 tabellen te gebruiken met CodeIgniter

  2. PostgreSQL Meest recente invoer selecteren voor een gegeven ID

  3. Nieuwe release:Spotlight Tuning Pack 7.1.9

  4. Slechte RAC-node opnieuw maken