2010-09-07 5 views
27

J'essaie de trouver le SQL équivalent de \ dT en utilisant le schéma d'information et je n'arrive pas à trouver quoi que ce soit. Est-ce qu'une telle chose existe? Exemple: Si j'ajoute le type personnalisé enum suivant, comment puis-je le voir dans le schéma d'information?Comment lister les types personnalisés en utilisant Postgres information_schema

CREATE TYPE communication.channels AS ENUM 
    ('text_message', 
    'email', 
    'phone_call', 
    'broadcast'); 

NOTE: J'ai SQL exacte utilisée par \ dT (récupéré en tournant l'exploitation forestière) mais je suis à la recherche spécifiquement pour une mise en œuvre plus propre à l'aide du information_schema

+0

Si vous ne souhaitez pas utiliser la ligne de commande, pgAdmin peut le faire – DrColossos

+0

une super façon « propre » est d'envelopper la requête dans une vue. enregistre également la requête de sorte que vous ne devez pas continuer à googler à chaque fois, hein http://albertech.blogspot.com/2016/12/show-all-custom-defined-types-in.html – jar

Répondre

8

Les énumérations ne sont pas dans la norme SQL et ne sont donc pas représentées dans le schéma d'informations. D'autres types définis par l'utilisateur sont normalement dans la vue user_defined_types, mais cela n'est pas implémenté. Donc pour le moment, vous ne pouvez pas utiliser le schéma d'information pour lister les types définis par l'utilisateur dans PostgreSQL.

0

Jetez un oeil ici: http://www.postgresql.org/docs/current/static/catalog-pg-enum.html

le catalogue pg_enum devrait avoir les données que vous cherchez avant

+0

Malheureusement le catalogue pg_enum ne contient que l'étiquette enum et non le schéma ou quoi que ce soit d'autre. Donc, vous devez faire une jointure de toute façon pour obtenir les données significatives –

35

Pour référence, voici le SQL de \ dT (pgAdmin utilise la même ou similaire)

SELECT  n.nspname as schema, t.typname as type 
FROM  pg_type t 
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace 
WHERE  (t.typrelid = 0 OR (SELECT c.relkind = 'c' FROM pg_catalog.pg_class c WHERE c.oid = t.typrelid)) 
AND  NOT EXISTS(SELECT 1 FROM pg_catalog.pg_type el WHERE el.oid = t.typelem AND el.typarray = t.oid) 
AND  n.nspname NOT IN ('pg_catalog', 'information_schema') 
+0

Ce code affiche la liste de tous les types, y compris les énumérations définies par l'utilisateur, mais ne donne pas les détails de la façon dont ils sont définis. –

9

Ceci est un moyen simple de répertorier tous les types définis enum dans la base de données en cours. Le résultat de la requête retourne deux colonnes, la première affiche le nom de tous les types de ENUM, le second affiche le nom de chaque valeur pour chaque type ENUM:

SELECT pg_type.typname AS enumtype, 
    pg_enum.enumlabel AS enumlabel 
FROM pg_type 
JOIN pg_enum 
    ON pg_enum.enumtypid = pg_type.oid; 
+1

La partie 'AS enumlabel' est redondante, vous ne trouvez pas? – Pere

2

J'utilise en vue de montrer mes noms de ENUM. Les données de cette vue peuvent par conséquent être utilisées dans une application pour fournir une liste des options disponibles pour un champ enum.

CREATE OR REPLACE VIEW vw_enums AS 
SELECT t.typname, e.enumlabel, e.enumsortorder 
FROM pg_enum e 
JOIN pg_type t ON e.enumtypid = t.oid;
6

Liste de tous définis par votre auto types:

\dT 

testDB=> \dT 
       List of data types 
Schema |   Name   | Description 
--------+-------------------------+------------- 
public | myType     | 
(1 row) 
Questions connexes