如何在 PostgreSQL 中列出 SQL 中的所有视图?

Rob*_*ark 53 postgresql view postgresql-9.1

如何在 PostgreSQL 中使用 SQL 命令列出数据库的所有视图?

我想要类似于 psql\dv命令的输出的东西,但最好只是一个视图名称列表。例如,

SELECT ...;
my_view_1
my_view_2
my_view_3
Run Code Online (Sandbox Code Playgroud)

我在 Ubuntu Linux 上运行 PostgreSQL v9.1.4。

Phi*_*lᵀᴹ 65

文档

 select table_name from INFORMATION_SCHEMA.views;
Run Code Online (Sandbox Code Playgroud)

如果您不希望系统视图是您的结果,请尝试以下操作:

 select table_name from INFORMATION_SCHEMA.views WHERE table_schema = ANY (current_schemas(false))
Run Code Online (Sandbox Code Playgroud)

  • 它为您提供了您有权访问的列表。要获取给定架构的数据,请将“where table_schema='USERNAME'”添加到查询中 (2认同)

Cao*_* Tu 29

您可以查询pg_catalog.pg_views您想要的信息:

select viewname from pg_catalog.pg_views;
Run Code Online (Sandbox Code Playgroud)

用于获取架构名称的精炼查询 - 以防万一您在不同架构中有多个具有相同名称的视图 - 并忽略了这些系统视图:

select schemaname, viewname from pg_catalog.pg_views
where schemaname NOT IN ('pg_catalog', 'information_schema')
order by schemaname, viewname;
Run Code Online (Sandbox Code Playgroud)

恕我直言,这种方式比查询 INFORMATION_SCHEMA.views 更好,原因在我对Phil's answer 的评论中说明。


gsi*_*ems 6

尝试:

SELECT  n.nspname AS table_schema,
        pg_catalog.pg_get_userbyid(c.relowner) AS table_owner,
        c.relname AS table_name
    FROM pg_catalog.pg_class c
         LEFT JOIN pg_catalog.pg_namespace n ON (n.oid = c.relnamespace)
    WHERE c.relkind  = 'v'
;
Run Code Online (Sandbox Code Playgroud)

如果您想要更多详细信息,可以修改以下内容以满足您的需求:

SELECT  n.nspname AS table_schema,
        pg_catalog.pg_get_userbyid(c.relowner) AS table_owner,
        c.relname AS table_name,
        s.n_live_tup AS row_count,
        count (a.attname) AS column_count,
        pg_catalog.obj_description(c.oid, 'pg_class') AS comments,
        CASE c.relkind
            WHEN 'v'
            THEN pg_catalog.pg_get_viewdef(c.oid, true)
            ELSE null
            END AS query
    FROM pg_catalog.pg_class c
         LEFT JOIN pg_catalog.pg_namespace n ON (n.oid = c.relnamespace)
         LEFT JOIN pg_catalog.pg_attribute a ON (c.oid = a.attrelid AND a.attnum > 0 AND NOT a.attisdropped)
         LEFT JOIN pg_catalog.pg_stat_all_tables s ON (c.oid = s.relid)
    WHERE c.relkind  = 'v'
GROUP BY n.nspname,
        c.relowner,
        c.relkind,
        c.relname,
        s.n_live_tup,
        c.oid
ORDER BY n.nspname,
        c.relname
;
Run Code Online (Sandbox Code Playgroud)


Tim*_*mur 5

如果您只需要在 in 中交互psql,您还可以\dv用于显示视图或\dm物化视图。或者使用 with +\dm+例如显示一些附加信息(主要用于查看物化视图大小)。

  • `\dv *.*` 和 `\dm *.* ` 有关所有模式的信息! (3认同)