PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Tronquer l'affichage par défaut dans les instructions postgres psql select

Il n'y a aucun moyen avec les options intégrées de psql que je connaisse.
Vous pouvez atteindre votre objectif avec une fonction comme @Drazen suggéré - juste beaucoup plus simple :

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;

Exemples d'appel :

SELECT * FROM f_trunc_columns(NULL::my_table);
SELECT * FROM f_trunc_columns(NULL::"MySchema"."My_funny_tbl", 11);

SQL Fiddle.

Remarques

  • Fonctionne pour tous tableau avec des colonnes de any type de données.

  • Ceci construit et exécute une requête de la forme :

    SELECT "FoO_id", left(c_text, 11), left(c_vc, 11)::character varying
    FROM   "FoO";
    
  • Il ne raccourcit que les colonnes des types de données choisis et laisse les autres seuls. J'ai inclus les types de caractères de base :
    bpchar est le nom interne du character et toutes les variantes.
    varchar est le nom interne pour character varying et toutes les variantes.
    Étendre à vos besoins.

  • La fonction renvoie les noms de colonne et les types de données d'origine pour toutes les colonnes. Je convertis de courtes colonnes en text avant d'alimenter left() , qui renvoie text , donc text les colonnes n'ont pas besoin d'un autre casting. Tous les autres types raccourcis nécessitent un retour au type d'origine. Certains types cassent si vous tronquez ! Cela ne fonctionne donc pas pour tous les types.

  • Vous pouvez ajouter LIMIT n à l'appel de fonction, mais la fonction peut facilement être étendue avec un LIMIT intégré - ce qui est beaucoup plus efficace pour les grandes tables, puisque la requête à l'intérieur de la fonction plpgsql est planifiée indépendamment.

  • Performance n'est pas bien pire qu'un simple SELECT * FROM tbl - sauf pour ledit LIMIT cas ou d'autres cas où vous imbriquez la fonction. Il est généralement préférable de ne pas imbriquer les fonctions PL/pgSQL renvoyant des ensembles :

  • J'ai intégré un max par défaut. longueur de 25 caractères, passez une longueur personnalisée en 2ème paramètre ou adaptez la valeur par défaut dans l'en-tête de la fonction à vos besoins.

  • Cette fonction est à l'abri d'éventuelles attaques par injection SQL via des identifiants construits de manière malveillante.

Réponses associées avec plus d'explications et de liens :

pgAdmin

... a la fonctionnalité que vous demandez, btw (pour toutes les colonnes):