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 :
bpchar
est le nom interne ducharacter
et toutes les variantes.varchar
est le nom interne pourcharacter 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'alimenterleft()
, qui renvoietext
, donctext
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 unLIMIT
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 leditLIMIT
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 :
- 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):