postgresql - 如何从 PostgreSQL 查询中获取列名和类型(不运行它)?

标签 postgresql jdbc amazon-redshift

对于任何给定的 (Postgres) SQL 查询,我需要能够提取列名和列类型。我不需要查询的结果。而且我需要它快速(即我不想等待查询本身完成 - 特别是如果它需要几分钟或更长时间)。

我以为我有一个解决方案:

为以下查询提取列和类型:

with X as (
  select nationality, count(*)
  from customers group by nationality
)
select *
from X

我会按如下方式包装它:

select *
from (
    with X as (
        select nationality, count(*)
        from customers group by nationality
    )
    select *
    from X
) q
where 1 = 0
limit 0

where 1 = 0limit 0 意味着它不会运行内容。

但是不行

如果 customers 表很大,那么上面的代码需要一分钟以上的时间才能运行。然后返回 0 个结果(如预期的那样)。

有什么想法吗?

有什么方法(无需编写我自己的 PSQL 解析器)从任意 PSQL 查询中获取列名和类型(无需运行它直至完成)?

注意:目标是让它与任意(用户输入的)SQL SELECT 查询一起使用。

最佳答案

使用 Postgres(及其 JDBC 驱动程序),您可以执行以下操作:

PreparedStatement pstmt = con.prepareStatement("select ... ");
ResultSetMetaData meta = pstmt.getMetaData();
for (int i=1; i <= meta.getColumnCount(); i++)
{
  System.out.println("Column name: " + meta.getColumnName(i) + ", data type: " + meta.getColumnTypeName(i));
}

请注意,您不需要在语句中添加 where falselimit 0。对 prepareStatement() 的调用实际上并没有执行查询。

关于postgresql - 如何从 PostgreSQL 查询中获取列名和类型(不运行它)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42099026/

相关文章:

sql - 将多行转换为多列的一行

ruby-on-rails - Ruby on Rails : Active Record query fails to execute only when hosted on heroku.

java - 尝试使用 JDBC 连接 Heroku 数据库时未找到合适的驱动程序

apache-spark - 在 Spark 与 Redshift 上执行查询

amazon-web-services - 如何从自定义 REST API 将数据加载到 Redshift

postgresql - Redshift 连接问题 : FATAL: password authentication failed for user

java - 在一条语句中使用 getGenerateKeys() 从 java 向 Oracle 数据库中插入多行

java - JDBC/Hibernate 获取大小和内存问题

GoLang 复制命令准备好的语句不工作

java - 如何在 native spring-data @Query 中使用命名参数?