我需要從任意SQL查詢中獲取列類型。這當然是可能的,PgAdmin3做到了。如何從任意SQL select中獲取列數據類型?
例如,給定一個查詢:
SELECT src.col, CAST(src.col AS varchar)
FROM (SELECT 'anything' AS col) AS src;
PgAdmin3返回:
正如你所看到的,列類型顯示基礎上執行的查詢,而不是表模式。如何以編程方式獲得結果集中列的數據類型?
我需要從任意SQL查詢中獲取列類型。這當然是可能的,PgAdmin3做到了。如何從任意SQL select中獲取列數據類型?
例如,給定一個查詢:
SELECT src.col, CAST(src.col AS varchar)
FROM (SELECT 'anything' AS col) AS src;
PgAdmin3返回:
正如你所看到的,列類型顯示基礎上執行的查詢,而不是表模式。如何以編程方式獲得結果集中列的數據類型?
C客戶端庫中的相應功能是PQftype
。它提供查詢中任何字段的類型(如Retrieving Query Result Information中所述)以及適用於結果字段的其他函數(如PQftable
或PQfsize
)。
不需要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
顯然做它通過PGResult的 ftype(column_number)
實例方法。我不知道這是否對ActiveRecord有任何幫助。與數據庫無關的API傾向於忽略不能輕易抽象到所支持的所有數據庫的功能。
使用系統目錄信息功能pg_typeof()
。
是的,它的工作。除非有人提供更簡單的答案,否則我會批准的,那就是像'EXPLAIN ...'那樣工作的地方,您可以在不修改SELECT子句的情況下傳遞整個查詢。我認爲這將是有用的,當SELECT子句是'*'就像在'SELECT src。* FROM(SELECT CAST('wow'AS varchar)AS col)AS src;'。 – skalee
我認爲這是同一個問題[在這裏回答](http://stackoverflow.com/questions/2146705/select-datatype-of-the-field-in-postgres)。該帖子中的查詢是否可以幫助你? –
@JeanneBoyarsky不是。這訪問信息模式,AFAIU將信息存儲在持久列上。我不認爲我可以使用它來了解一些'COUNT(*)'是'bigint'既不知道應用類型轉換。或者,也許我沒有得到信息架構的目的? – skalee
哦。所以你想要類似描述的東西,而不是表格。如果您使用的是像Java這樣的調用語言,則可以使用API從查詢的元數據中獲取此信息。我不知道怎麼做在命令行(原始的SQL) –