【问题标题】:How to describe columns (get their names, data types, etc.) of a SQL query in PostgreSQL如何在 PostgreSQL 中描述 SQL 查询的列(获取它们的名称、数据类型等)
【发布时间】:2017-10-19 18:25:53
【问题描述】:

我需要一种方法来从 SELECT 查询(游标)中获取列的“描述”,例如它们在 PostgreSQL(或更好的 PL/pgSQL)中的名称、数据类型、精度、比例等。

我正在从 Oracle PL/SQL 过渡,在那里我可以使用内置过程 dbms_sql.describe_columns 获得此类描述。它返回一个记录数组,一个给定(已解析)游标的每一列。

EDB 也实现了 (https://www.enterprisedb.com/docs/en/9.0/oracompat/Postgres_Plus_Advanced_Server_Oracle_Compatibility_Guide-127.htm#P13324_681237)

此类查询的示例:

select col1 from tab where col2 = :a

我需要一个可以像这样调用的 API(或解决方法)(希望如此):

select query_column_description('select col1 from tab where col2 = :a');

这将返回类似于:

{{"col1","numeric"}}

为什么?我们构建视图,其中这些查询成为单独的列。例如,视图的查询如下所示:

select (select col1 from tab where col2 = t.colA) as col1::numeric
  from tab_main t

【问题讨论】:

  • 使用 psycopg2 (stackoverflow.com/questions/10252247/…) 可以获得类似的东西,但我希望我可以留在 PL/pgSQL 中,所以我不必处理(安装/学习/等)psycopg2只是为了这个(也许还有一些我还没有发现的很酷/需要的功能)
  • 服务器端没有内置任何东西。在客户端,我知道 JDBC 可以做到这一点,我猜 ODBC 也是如此。我假设这两个接口都使用SPI
  • 如果您觉得可以,请为答案投票。谢谢。

标签: postgresql cursor


【解决方案1】:

http://sqlfiddle.com/#!17/21c7a/2

您可以使用系统表:

第一步使用您的查询创建一个临时视图(不带 where 子句)

create or replace view temporary view a_view as
    select col1 from tab 

然后选择

select
    row_to_json(t.*)
from (
    select 
        column_name,
        data_type
    from
        information_schema.columns
    where
        table_schema = 'public' and
        table_name   = 'a_view'
) as t

【讨论】:

  • 谢谢@Indent。我将通过创建一个临时视图来使用您的解决方法。
  • 好的,很酷。如果您觉得可以,请为答案投票。谢谢。祝你有美好的一天。
  • 对不起@Indent,由于我的声誉低,我不能投票。但是,您的回答对我帮助很大。再次感谢。
猜你喜欢
  • 1970-01-01
  • 2017-06-25
  • 2010-11-28
  • 2018-08-05
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 2013-12-10
  • 1970-01-01
相关资源
最近更新 更多