【问题标题】:Column names and data types for materialized views in PostgreSQL?PostgreSQL 中物化视图的列名和数据类型?
【发布时间】:2015-09-16 03:03:54
【问题描述】:

对于一般表和视图,我可以通过运行以下查询来查看它们的数据类型:

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

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

有没有办法查看这些信息?

【问题讨论】:

    标签: postgresql materialized-views


    【解决方案1】:

    我认为你非常接近。最后一步是加入pg_type

    join pg_catalog.pg_type as tp on tp.oid = attr.atttypid
    

    tp.typname 字段将具有数据类型。

    以下查询使用命名空间(例如模式)和关系(例如物化视图)名称获取列数据类型:

    select 
        attr.attnum,
        ns.nspname as schema_name, 
        cls.relname as table_name, 
        attr.attname as column_name,
        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.oid = attr.atttypid
    where 
        ns.nspname = 'your_schema'
        and cls.relname = 'your_materialized_view'
        and attr.attnum >= 1
    order by 
        attr.attnum
    

    你必须改变'your_schema''your_materialized_view'

    【讨论】:

    • @andré-c-andersen,你为什么要通过typelem 加入pg_catalog.pg_type?根据documentation,该字段仅用于类数组类型。我认为应该有pg_catalog.pg_type.oid
    • @Hubbitus 那只是无知。我已根据您的建议更新了查询。它看起来更干净,似乎工作正常。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2016-12-08
    • 2021-12-04
    • 2017-12-03
    • 1970-01-01
    • 2017-11-08
    • 2016-02-06
    • 1970-01-01
    • 2022-08-09
    相关资源
    最近更新 更多