2

如何通过 Java 在 Postgres 中获取数组列的基本类型/维度?

我有一个包含数组的表,例如int[][]text[]

当我从 JDBC 遍历元数据时,我只能得到类型为java.sql.Array. 即使在information_schema.columns其中存储为 ARRAY 也是如此。

我如何知道基本类型及其尺寸?

我现在正在研究转储表信息的工具。

4

3 回答 3

4

对于数组基类型,DatabaseMetaData.getColumns()返回ResultSet包含列的元数据。返回的列之一是TYPE_NAME. 这似乎包含数组基本类型的名称,前缀为下划线。例如,_int4_textpg_type中有一些关于类型的附加信息可能会有所帮助。

对于维度,它们似乎不太可能出现在元数据中。从文档中:

但是,当前实现忽略了任何提供的数组大小限制,即行为与未指定长度的数组相同。

当前的实现也不强制声明的维数。无论大小或维数如何,特定元素类型的数组都被认为是同一类型。因此,在 CREATE TABLE 中声明数组大小或维数只是文档;它不会影响运行时行为。

array_dims函数将返回数组值的当前维度。但由于表中的每一行都可能不同,我怀疑这会对你有所帮助。

更新:看起来维度在元数据中可用。请参阅@a_horse_with_no_name 的答案

于 2013-05-18T11:09:11.477 回答
2

除了@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。(目前,数组的维数没有强制执行,因此任何非零值实际上都意味着“它是一个数组”。)

于 2013-05-18T13:43:24.990 回答
2

可以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

于 2013-05-18T13:46:58.557 回答