2017-05-30 53 views
1

在postgres中,如何查詢列是否包含int [] [](與int []?相對)可以查詢postgresql的列數組維度嗎? (測試列是int [] []?)

我可以查詢有關列類型:

select * 
from INFORMATION_SCHEMA.COLUMNS where table_name = 'mytable' 

我看到udt_name和data_type聯合提供了列的基本類型。但是這些列中沒有一個說明數組列的arity(arity對於int [] []是2,對於int []是1,對於int來說爲零)。

如果我在pgadmin3中查看錶格架構,Postgres顯然具有此信息,因爲我可以看到它。

回答

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) 
+1

也許值得一提的是'attndims'更像是一個文檔屬性。 *目前,數組的維數沒有被強制執行,所以任何非零值都意味着「它是一個數組」。* – pozs

+0

'attndims'的值反映了列在'create table'中被聲明的方式。我認爲文檔中的註釋提到這樣的事實,即在Postgres中,維度不是被強制的,不管它是如何聲明的。 – klin

+0

是的,確切地說。正如我所說的(或至少是打算)超過1個服務器的值只有文檔。因爲實際列值的尺寸可能與它不同。 – pozs

相關問題