可以使用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)
也許值得一提的是'attndims'更像是一個文檔屬性。 *目前,數組的維數沒有被強制執行,所以任何非零值都意味着「它是一個數組」。* – pozs
'attndims'的值反映了列在'create table'中被聲明的方式。我認爲文檔中的註釋提到這樣的事實,即在Postgres中,維度不是被強制的,不管它是如何聲明的。 – klin
是的,確切地說。正如我所說的(或至少是打算)超過1個服務器的值只有文檔。因爲實際列值的尺寸可能與它不同。 – pozs