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

时间:2017-02-07 20:09:42

标签: 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查询。

2 个答案:

答案 0 :(得分:2)

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

class YourCell: UICollectionViewCell {


    override var isSelected: Bool {
        willSet(newValue) {    
            let newColor = isSelected ? UIColor.red : UIColor.green
            UIView.animate(withDuration: 1, delay: 0.4, options: .curveEaseInOut, animations: {
                self.backgroundColor = newColor
            }, completion: { _ in
                // here the animation is done - nothing to do here probably
            })
        }
    }

}

请注意,您无需在语句中添加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的调用实际上并不执行查询。

答案 1 :(得分:0)

将SQL语句作为字符串,您是否可以在字符串中添加“LIMIT = 0”并运行修改后的查询?当然,这只会获取列名,但这些可以用于查询类型的信息模式。

如果SQL已包含限制,则可以修改其参数?