在postgres中,如何查询列是否包含int [] [](而不是int []?)
我可以查询有关列类型的信息:
location
我看到udt_name和data_type共同提供了列的基本类型。但是这些列中没有一个列出数组列的arity是什么(arity对于int [] []为2,对于int []为1,对于int为零。
Postgres显然有这些信息,因为我在pgadmin3中查看表格的模式时可以看到它。
答案 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)