256 votes

Sélectionner le type de données du champ dans postgres

Comment puis-je obtenir le type de données d'un champ spécifique d'une table dans postgres ? Par exemple J'ai la table suivante, student_details ( stu_id integer, stu_name varchar(30 ), joined_date timestamp ) ;

En utilisant le nom du champ / ou tout autre moyen, je dois obtenir le type de données du champ spécifique. Y a-t-il une possibilité ?

10voto

Les vues du schéma d'information et pg_typeof() renvoient des informations de type incomplètes. Parmi ces réponses, psql donne les informations les plus précises sur le type. (Le PO peut ne pas avoir besoin d'informations aussi précises, mais il doit en connaître les limites).

create domain test_domain as varchar(15);

create table test (
  test_id test_domain, 
  test_vc varchar(15), 
  test_n numeric(15, 3), 
  big_n bigint,
  ip_addr inet
);

Utilisation de psql y \d public.test montre correctement l'utilisation du type de données test_domain la longueur des colonnes varchar(n), et la précision et l'échelle des colonnes numeric(p, s).

sandbox=# \\d public.test
             Table "public.test"
 Column  |         Type          | Modifiers
---------+-----------------------+-----------
 test\_id | test\_domain           |
 test\_vc | character varying(15) |
 test\_n  | numeric(15,3)         |
 big\_n   | bigint                |
 ip\_addr | inet                  |

Cette requête contre une vue d'information_schema fait pas montrent l'utilisation de test_domain du tout. Il ne rapporte pas non plus les détails des colonnes varchar(n) et numeric(p, s).

select column_name, data_type 
from information_schema.columns 
where table_catalog = 'sandbox'
  and table_schema = 'public'
  and table_name = 'test';

 column\_name |     data\_type
-------------+-------------------
 test\_id     | character varying
 test\_vc     | character varying
 test\_n      | numeric
 big\_n       | bigint
 ip\_addr     | inet

Vous pourrait être en mesure d'obtenir toutes ces informations en rejoignant d'autres vues d'information_schema, ou en interrogeant directement les tables du système. psql -E pourrait aider à cela.

La fonction pg_typeof() montre correctement l'utilisation de test_domain mais ne rapporte pas les détails des colonnes varchar(n) et numeric(p, s).

select pg_typeof(test_id) as test_id, 
       pg_typeof(test_vc) as test_vc,
       pg_typeof(test_n) as test_n,
       pg_typeof(big_n) as big_n,
       pg_typeof(ip_addr) as ip_addr
from test;

   test\_id   |      test\_vc      | test\_n  | big\_n  | ip\_addr
-------------+-------------------+---------+--------+---------
 test\_domain | character varying | numeric | bigint | inet

6voto

Piotr Findeisen Points 1712

Tirer le type de données de information_schema est possible, mais pas pratique (nécessite de joindre plusieurs colonnes avec un case déclaration). On peut aussi utiliser format_type pour le faire, mais elle fonctionne sur les identificateurs de type internes qui sont visibles dans le fichier pg_attribute mais pas dans information_schema . Exemple

SELECT a.attname as column_name, format_type(a.atttypid, a.atttypmod) AS data_type
FROM pg_attribute a JOIN pg_class b ON a.attrelid = b.relfilenode
WHERE a.attnum > 0 -- hide internal columns
AND NOT a.attisdropped -- hide deleted columns
AND b.oid = 'my_table'::regclass::oid; -- example way to find pg_class entry for a table

Sur la base de https://gis.stackexchange.com/a/97834 .

2voto

Jian He Points 69

https://www.postgresql.org/docs/current/app-psql.html#APP-PSQL-PATTERNS

\gdesc Affiche la description (c'est-à-dire les noms des colonnes et les types de données) du résultat de l'opération. types de données) du résultat du tampon de requête actuel. La requête n'est pas exécutée ; toutefois, si elle contient une erreur de syntaxe, cette erreur sera cette erreur sera signalée de la manière habituelle.

Si le tampon de requête actuel est vide, la requête la plus récemment envoyée est décrite à la place.

Donc vous pouvez table student_details limit 0 \gdesc La sortie occupait moins d'espace que \d

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X