2015-06-29 4 views
2

Для общих таблиц и представлений, я могу видеть их тип данных, выполнив следующий запрос:Типы данных столбцов для материализованных представлений?

select data_type from information_schema.columns 
where ..... 

Однако это не кажется, что какая-либо информация о материализованные представления появляются здесь.

Я могу получить список столбцов для материализованного представления, выполнив:

SELECT 
     a.attname as column_name 
    FROM 
     pg_catalog.pg_attribute a 
     INNER JOIN 
     (SELECT c.oid, 
      n.nspname, 
      c.relname 
     FROM pg_catalog.pg_class c 
      LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace 
     WHERE c.relname ~ ('^(materializedview)$') 
      AND pg_catalog.pg_table_is_visible(c.oid) 
     ORDER BY 2, 3) b 
     ON a.attrelid = b.oid 
     INNER JOIN 
     (SELECT 
      a.attrelid, 
      max(a.attnum) as max_attnum 
     FROM pg_catalog.pg_attribute a 
     WHERE a.attnum > 0 
      AND NOT a.attisdropped 
     GROUP BY a.attrelid) e 
     ON a.attrelid=e.attrelid 
    WHERE a.attnum > 0 
    AND NOT a.attisdropped 
    ORDER BY a.attnum 

Но я не мог понять, если я могу определить, какой именно тип столбца/данные.

Есть ли способ просмотра этой информации?

ответ

3

Я думаю, что вы очень близки. Последний шаг должен был бы присоединиться к pg_type:

join pg_catalog.pg_type as tp on tp.typelem = a.atttypid 

Поле tp.typname будет иметь тип данных. Хотя, кажется, фильтр должен быть добавлен, чтобы удалить line типы данных, что бы это:

cast(tp.typanalyze as text) = 'array_typanalyze' 

Я не в полной мере понять базовую модель данных, поэтому использовать мое решение ниже с зерном соли. Во всяком случае, на основе вашего вклада я закончил с помощью следующего запроса, который получает типы данных столбцов с использованием пространства имен (например, схемы) и отношение (например, материализованное представление) Имя:

select 
    ns.nspname as schema_name, 
    cls.relname as table_name, 
    attr.attname as column_name, 
    trim(leading '_' from tp.typname) as datatype 
from pg_catalog.pg_attribute as attr 
join pg_catalog.pg_class as cls on cls.oid = attr.attrelid 
join pg_catalog.pg_namespace as ns on ns.oid = cls.relnamespace 
join pg_catalog.pg_type as tp on tp.typelem = attr.atttypid 
where 
    ns.nspname = 'your_schema' and 
    cls.relname = 'your_materialized_view' and 
    not attr.attisdropped and 
    cast(tp.typanalyze as text) = 'array_typanalyze' and 
    attr.attnum > 0 
order by 
    attr.attnum 

Вы должны изменить 'your_schema' и 'your_materialized_view'.