如何通过 Java 在 Postgres 中获取数组列的基本类型/维度?
我有一个包含数组的表,例如int[][]
和text[]
。
当我从 JDBC 遍历元数据时,我只能得到类型为java.sql.Array
. 即使在information_schema.columns
其中存储为 ARRAY 也是如此。
我如何知道基本类型及其尺寸?
我现在正在研究转储表信息的工具。
如何通过 Java 在 Postgres 中获取数组列的基本类型/维度?
我有一个包含数组的表,例如int[][]
和text[]
。
当我从 JDBC 遍历元数据时,我只能得到类型为java.sql.Array
. 即使在information_schema.columns
其中存储为 ARRAY 也是如此。
我如何知道基本类型及其尺寸?
我现在正在研究转储表信息的工具。
对于数组基类型,DatabaseMetaData.getColumns()
返回ResultSet
包含列的元数据。返回的列之一是TYPE_NAME
. 这似乎包含数组基本类型的名称,前缀为下划线。例如,_int4
或_text
。pg_type中有一些关于类型的附加信息可能会有所帮助。
对于维度,它们似乎不太可能出现在元数据中。从文档中:
但是,当前实现忽略了任何提供的数组大小限制,即行为与未指定长度的数组相同。
当前的实现也不强制声明的维数。无论大小或维数如何,特定元素类型的数组都被认为是同一类型。因此,在 CREATE TABLE 中声明数组大小或维数只是文档;它不会影响运行时行为。
该array_dims
函数将返回数组值的当前维度。但由于表中的每一行都可能不同,我怀疑这会对你有所帮助。
更新:看起来维度在元数据中可用。请参阅@a_horse_with_no_name 的答案。
除了@Joe 已经清除的内容之外,您还可以使用pg_typof()
它从 PostgreSQL 获取类型信息。
在此示例中,给定一个二维整数数组:
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)。
如手册中所述,pg_attribute.attndims
此处的用途有限:
维数,如果列是数组类型;否则为 0。(目前,数组的维数没有强制执行,因此任何非零值实际上都意味着“它是一个数组”。)
可以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()
实际上也会返回,但该列将携带您想要的信息。integer[]
int[][]
attndims