PostgreSQL 中物化视图的列名和数据类型?
Column names and data types for materialized views in PostgreSQL?
对于一般的表和视图,我可以通过运行下面的查询来查看它们的数据类型:
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
但是,我无法弄清楚我是否可以确定底层 column/data 类型是什么。
有没有办法查看这些信息?
我认为你非常接近。最后一步是加入 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'
。
对于一般的表和视图,我可以通过运行下面的查询来查看它们的数据类型:
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
但是,我无法弄清楚我是否可以确定底层 column/data 类型是什么。
有没有办法查看这些信息?
我认为你非常接近。最后一步是加入 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'
。