是否有返回查询、表或视图的字段名称和字段类型的 PostgreSQL 查询或命令?
例如,如果应用于简单的 SELECT 查询的解决方案SELECT * from person
应该返回一个列表,如:
Column Name | Column Type
===========================
First Name | character
Last Name | character
Age | integer
Date of Birth | date
我查看了information_schema
下面答案中描述的视图,它似乎很好地涵盖了表格,我怀疑它也涵盖了视图,但我还没有检查过。
最后一个是任意但有效的 SELECT 查询,例如在数据库中涉及、JOINS
等 UNIONS
。是否有内置过程或其他存储过程或脚本可以为任何有效的 QUERY 返回相同的内容?
我正在开发一个创建数据和查询表单的程序,数据验证和对返回的数据执行函数需要这些信息。
information_schema
与系统目录我们已经讨论过很多次了。信息模式服务于某些目的。系统目录是所有信息的实际来源。
信息模式提供有助于可移植性的标准化视图 - 主要是跨主要 Postgres 版本,因为一旦您的查询足够复杂以查找系统目录,跨不同 RDBMS 平台的可移植性通常是一种错觉。值得注意的是,Oracle 仍然不支持信息模式。
信息模式中的视图必须经过许多环节才能达到符合标准的格式。这使它们变得缓慢,有时甚至非常缓慢。比较这些基本对象的计划和性能:
差异是显着的。
你的例子
对于您的示例
SELECT * from tbl
,比较下面这个简单表的两个查询:使用
pg_attribute
:format_type()
返回带有所有修饰符的完整类型:另请注意,转换
regclass
为根据当前解析表名search_path
。如果名称无效,它会引发异常。看:使用
information_schema.columns
:信息是标准化的,但不完整:
要获取数据类型的完整信息,您需要另外考虑所有这些列:
相关答案:
利弊清单
最大的专业人士(IMO)以粗体显示。
信息模式视图
系统目录
oid
)任意查询
要从查询中获取相同的列名和类型列表,您可以使用一个简单的技巧:查询输出中
CREATE
的临时表,然后使用与上述相同的技术。您可以附加
LIMIT 0
,因为您不需要实际数据:要获取各个列的数据类型,您还可以使用函数
pg_typeof()
:您可以使用
psql
命令行客户端。\dt
将显示表格列表\dv
将显示视图列表\d [object_name]
将描述表或视图的架构不确定您将如何描述查询。
更多信息:https ://manikandanmv.wordpress.com/tag/basic-psql-commands/
如果您有权访问 pg_catalog 并使用 PgAdmin3,我强烈推荐我在 Valentine's Tech 博客 ( http://tech.valgog.com/2011/02/pgadmin-iii-macros-get-table-fields) 上找到的解决方案。 html ). 它是一个 PgAdmin3 宏,可以通过快捷方式访问以显示所选表名的定义。
像魅力一样工作,非常有用。
使用视图,它们是 SQL 标准并包含您想要的信息。
information_schema
您也可以直接访问
pg_class
,pg_attribute
等,但这不便携且通常更繁琐;对于某些事情,您可能需要,等辅助函数。oidvectortypes
pg_get_function_arguments
如果您想查看如何
psql
执行类似的内容\dt
,请运行psql -E
- 它会打印查询。但是,information_schema
如果它可以满足您的需求,通常最好使用它。这可能过于简单,但 pgAdmin4 会在输出结果中显示字段类型。上面的其他解决方案可能更优雅,但是当我只需要快速回答时,我发现 pgAdmin4 的查询 GUI 工作得很好。试图找出视图或函数返回的计算字段的字段类型可能很棘手。