如何在Java中由Postgres獲取數組列的基類型/維數?如何通過jdbc在postgres中獲取數組基類型
我有一個表,其中包含數組像int[][]
和text[]
。
當我遍歷JDBC的元數據時,我只能得到java.sql.Array
的類型。 即使在information_schema.columns
它簡單地存儲爲ARRAY。
我如何知道基本類型及其維度?
我現在正在研究轉儲表信息的工具。
如何在Java中由Postgres獲取數組列的基類型/維數?如何通過jdbc在postgres中獲取數組基類型
我有一個表,其中包含數組像int[][]
和text[]
。
當我遍歷JDBC的元數據時,我只能得到java.sql.Array
的類型。 即使在information_schema.columns
它簡單地存儲爲ARRAY。
我如何知道基本類型及其維度?
我現在正在研究轉儲表信息的工具。
除了什麼@Joe already cleared up,你可以使用pg_typof()
從PostgreSQL獲取類型信息。
鑑於整數的在本例中的2維數組:
SELECT pg_typeof(a)::text AS type
,(SELECT typname FROM pg_type WHERE oid = pg_typeof(a)) AS base_type
,array_dims(a) AS dims
FROM (SELECT '{{11,12,13},{21,22,23}}'::int[]) x(a);
type | base_type | dims
-----------+-----------+------------
integer[] | _int4 | [1:2][1:3]
注意,陣列尺寸(dims
)可以是對於每個值不同。 Postgres目前沒有執行維度(直到幷包括v9.3)。
As documented in the manual,pg_attribute.attndims
是使用有限這裏:
維數,如果列是一個數組類型;否則爲0. (目前,數組的維數沒有被強制執行,所以任何非零值都意味着「它是一個數組」。)
對於數組基類型,DatabaseMetaData.getColumns()
返回包含列元數據的ResultSet
。返回的列之一是TYPE_NAME
。這似乎包含數組基類型的名稱,前綴爲下劃線。例如,_int4
或_text
。有一些關於pg_type中的類型的其他信息可能會有所幫助。
對於這些維度,它們似乎不太可能在元數據中。從documentation:
但是,目前的實現忽略任何提供的數組的大小限制,即該行爲是相同的,作爲未指定長度的陣列。
當前實現不強制聲明的維數。無論大小或維數如何,特定元素類型的數組都被視爲相同類型。因此,在CREATE TABLE中聲明數組大小或維數是簡單的文檔;它不會影響運行時行爲。
array_dims
函數將返回數組值的當前維數。但是,由於表格中的每一行都可能有所不同,我懷疑這會對您有所幫助。
UPDATE:它看起來尺寸在元數據中可用。見@a_horse_with_no_name's answer。
您的更新有問題,因爲@a_horse在這個問題上。看到我留下的評論。 –
@ErwinBrandstetter雖然我同意它沒有執行,但信息似乎仍然存在。我在9.1.9只測試了1到3個維度,'attndims'是正確的。 –
它*不能*是「正確的」,因爲沒有「正確的」。無論您如何聲明列,相關列都可以保存任意維度的數組。你不必相信我,只要嘗試一下。 '0' /'> 0'以外'attndims'中的信息僅適用於* intent *的文檔。不保證有關實際值的任何信息。 –
可以直接查詢pg_attributes
:
select att.attname,
att.attndims,
pg_catalog.format_type(atttypid, NULL) as display_type
from pg_attribute att
join pg_class tbl on tbl.oid = att.attrelid
join pg_namespace ns on tbl.relnamespace = ns.oid
where tbl.relname = 'your_table_name'
and ns.nspname = 'table_schema'
SQLFiddle例如:http://sqlfiddle.com/#!12/50301/1
注意format_type()
實際上將返回即使柱規定爲int[][]
integer[]
但attndims
列將攜帶你想要的信息。
'attndims'是*旨在*爲此目的,但它目前尚未實施或強制執行,如[手冊通知](http://www.postgresql.org/docs/current/interactive/catalog-pg-attribute.html):'維數,如果列是一個數組類型;否則爲0.(目前,數組的維數沒有被強制執行,所以任何非零值都意味着「它是一個數組」。)# –
@ErwinBrandstetter:問題是「*如何獲得數組列的維數」*這正是「attndims」所做的。事實上,這不是強制數據被放入該列與該問題無關(至少尚未......) –
謝謝:)是的,我沒有意識到,數組維度是不強制執行到現在爲止。 – user1192878
謝謝:)這應該是一個解決方案,以及:) – user1192878
意識到,你是最終真實的維度是不可靠的:) – user1192878