对于常规表和 View ,我可以通过运行以下查询来查看其数据类型:

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

但是,似乎没有在此处显示有关实例化 View 的任何信息。

我可以通过运行获取物化 View 的列列表:
    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

但是,我无法弄清楚是否可以确定底层的列/数据类型是什么。

有没有办法查看此信息?

最佳答案

我觉得你很亲密。最后一步是加入pg_type:

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

字段tp.typname将具有数据类型。尽管看起来必须添加一个过滤器以删除line数据类型,但无论如何:
cast(tp.typanalyze as text) = 'array_typanalyze'

我不完全了解基础数据模型,因此请在下面使用我的解决方案。无论如何,根据您的贡献,我最终得到了以下查询,该查询使用 namespace (例如,架构)和关系(例如,物化 View )名称获取列数据类型:
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'

09-11 19:57
查看更多