可以在postgresql中查询列数组维度吗? (测试列是否为int [] []?)

时间:2017-05-30 22:05:54

标签: postgresql

在postgres中,如何查询列是否包含int [] [](而不是int []?)

我可以查询有关列类型的信息:

location

我看到udt_name和data_type共同提供了列的基本类型。但是这些列中没有一个列出数组列的arity是什么(arity对于int [] []为2,对于int []为1,对于int为零。

Postgres显然有这些信息,因为我在pgadmin3中查看表格的模式时可以看到它。

1 个答案:

答案 0 :(得分:3)

您可以使用array_ndims()

select 
    array_ndims(array[1,2]) as "int[]", 
    array_ndims(array[[1],[2]]) as "int[][]"

 int[] | int[][] 
-------+---------
     1 |       2
(1 row) 

数组列的维数存储在系统目录pg_attribute,中,例如:

create table test(a int[], b int[][], c int[][][]);

select attname, typname, attndims
from pg_class c
join pg_attribute a on c.oid = attrelid
join pg_type t on t.oid = atttypid
where c.oid = 'test'::regclass
and attnum > 0;

 attname | typname | attndims 
---------+---------+----------
 a       | _int4   |        1
 b       | _int4   |        2
 c       | _int4   |        3
(3 rows)

attndims的值反映了列的声明方式,可能与实际值的维度不同:

insert into test values (array[1], array[2], array[3]);

select array_ndims(a) as a, array_ndims(b) as b, array_ndims(c) as c
from test;

 a | b | c 
---+---+---
 1 | 1 | 1
(1 row)