2017-02-07 42 views
0

對於任何給定的(Postgres)SQL查詢,我需要能夠提取列名稱和列類型。我不需要查詢的結果。我需要它很快(即我不希望等待查詢本身完成 - 特別是如果需要幾分鐘或更長的時間)。如何從PostgreSQL查詢中獲取列名和類型(不運行它)?

我想我有一個解決方案:

要提取列和類型下面的查詢:

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

和:

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

我將如下把它包where 1 = 0limit 0意味着它不會運行內容。

但它不工作

如果customers表是巨大的,那麼上述接管一分鐘運行。然後返回0結果(如預期)。

任何想法?

是否有任何方法(無需編寫我自己的PSQL解析器)從任意任意PSQL查詢中獲取列名和類型(無需運行它即可完成)?

注意:目標是爲了與任何(用戶輸入的)SQL SELECT查詢一起工作。

+0

例如,可能用Java/JDBC和PreparedStatement(至少在Postgres中,我不知道Redshift驅動程序是否支持這個 - 這兩個完全不同) –

+0

是的,[protocol](https://www.postgresql.org/ docs/8.0/static/protocol-flow.html#AEN56097)允許您在沒有實際執行任何內容的情況下獲取RowDescription,但您的客戶端庫是否暴露此問題是另一個問題。 –

+0

嘿@a_horse_with_no_name。你如何使用JDBC爲Postgres做到這一點? –

回答

2

隨着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()的調用並不實際執行查詢。

+0

這有效。謝謝。對於紅移也是如此。 –

0

給定一個SQL語句作爲字符串,你能不能在字符串中添加「LIMIT = 0」並運行修改後的查詢?當然這隻會得到列名,但這些可以用來查詢類型的信息模式。

如果SQL已經包含一個限制,它的參數可以被修改?

+0

這不幸也不起作用。設置0或1的限制仍然需要2分鐘以上才能返回。 –

相關問題