对于任何给定的 (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 = 0
和 limit 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 false
或 limit 0
。对 prepareStatement()
的调用实际上并没有执行查询。
关于postgresql - 如何从 PostgreSQL 查询中获取列名和类型(不运行它)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42099026/