2013-11-28 55 views
2

我需要從任意SQL查詢中獲取列類型。這當然是可能的,PgAdmin3做到了。如何從任意SQL select中獲取列數據類型?

例如,給定一個查詢:

SELECT src.col, CAST(src.col AS varchar) 
FROM (SELECT 'anything' AS col) AS src; 

PgAdmin3返回:

正如你所看到的,列類型顯示基礎上執行的查詢,而不是表模式。如何以編程方式獲得結果集中列的數據類型?

+0

我認爲這是同一個問題[在這裏回答](http://stackoverflow.com/questions/2146705/select-datatype-of-the-field-in-postgres)。該帖子中的查詢是否可以幫助你? –

+0

@JeanneBoyarsky不是。這訪問信息模式,AFAIU將信息存儲在持久列上。我不認爲我可以使用它來了解一些'COUNT(*)'是'bigint'既不知道應用類型轉換。或者,也許我沒有得到信息架構的目的? – skalee

+0

哦。所以你想要類似描述的東西,而不是表格。如果您使用的是像Java這樣的調用語言,則可以使用API​​從查詢的元數據中獲取此信息。我不知道怎麼做在命令行(原始的SQL) –

回答

1

C客戶端庫中的相應功能是PQftype。它提供查詢中任何字段的類型(如Retrieving Query Result Information中所述)以及適用於結果字段的其他函數(如PQftablePQfsize)。
不需要EXPLAIN,這些信息隨每組結果返回給SQL客戶端。

PQftype

Returns the data type associated with the given column number. 

的整數返回是該類型的內部OID號。列 號碼從0開始。

Oid PQftype(const PGresult *res, 
       int column_number); 

你可以查詢系統表pg_type裏獲得的各種數據類型的名稱和屬性 。內置數據 類型的OID在 源樹中的src/include/catalog/pg_type.h文件中定義。

此外,所有類型的數據庫中的OID的可以得到:

select oid, typname from pg_type; 

其他語言一般基於libpq庫的Postgres的支持,這樣他們就可以調用這個函數。他們可能會也可能不會公開它,這取決於他們的實施有多完整。

在紅寶石的情況下,駕駛員ruby-pg顯然做它通過PGResultftype(column_number)實例方法。我不知道這是否對ActiveRecord有任何幫助。與數據庫無關的API傾向於忽略不能輕易抽象到所支持的所有數據庫的功能。

2

使用系統目錄信息功能pg_typeof()

+0

是的,它的工作。除非有人提供更簡單的答案,否則我會批准的,那就是像'EXPLAIN ...'那樣工作的地方,您可以在不修改SELECT子句的情況下傳遞整個查詢。我認爲這將是有用的,當SELECT子句是'*'就像在'SELECT src。* FROM(SELECT CAST('wow'AS varchar)AS col)AS src;'。 – skalee

相關問題