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);
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 :
bpcharest le nom interne ducharacteret toutes les variantes.varcharest le nom interne pourcharacter varyinget 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
textavant d'alimenterleft(), qui renvoietext, donctextles 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 unLIMITinté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 leditLIMITcas 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 :
- Remplacer les chaînes vides par des valeurs nulles
- Refactoriser une fonction PL/pgSQL pour renvoyer la sortie de diverses requêtes SELECT
- Nom de table en tant que Paramètre de la fonction PostgreSQL
- Type de données Postgres
- Interroger les détails du schéma d'une table dans PostgreSQL ?
- Comment vérifier si une table existe dans un schéma donné
pgAdmin
... a la fonctionnalité que vous demandez, btw (pour toutes les colonnes):
