2015-06-29 50 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'