2017-05-30 4 views
1

postgresでは、カラムにint [] []が含まれているかどうかを問い合わせるにはどうすればよいですか?postgresqlに列配列の次元を問い合わせることはできますか? (カラムがint [] []の場合のテスト)

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

udt_nameとdata_typeが一緒に列の基本タイプを提供しています。しかし、これらの列のどれも、配列の列のアリティが何であるかを言いません(int [] []では2、int []では1、intでは0)。

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」はドキュメント属性のようなものです。 *現在、配列の次元数は強制されていないので、0でない値は事実上 "配列"を意味します* – pozs

+0

'attndims'の値は、' create table'で列がどのように宣言されたかを反映します。私はドキュメントの注釈は、Postgresの次元が宣言された方法にかかわらず強制されないという事実を指していると思います。 – klin

+0

はい、正確です。私が言ったように(少なくとも、意図された)1サーバ以上の値はドキュメントのみ。実際の列の値の次元は、それとは異なる可能性があるためです。 – pozs

関連する問題