https://www.cnblogs.com/alianbog/p/5665411.html
postgresql支持?jǐn)?shù)組類型,可以是基本類型,也可以是用戶自定義的類型糊余。日常中使用數(shù)組類型的機(jī)會(huì)不多故痊,但還是可以了解一下豫缨。不像C或JAVA高級(jí)語(yǔ)言的數(shù)組下標(biāo)從0開(kāi)始,postgresql數(shù)組下標(biāo)從1開(kāi)始摔桦,既可以指定長(zhǎng)度社付,也可以不指定長(zhǎng)度。且postgresql既支持一維數(shù)組邻耕,也支持多維數(shù)組鸥咖,但是平時(shí)二維數(shù)組也就夠用了。
示例1.使用ARRAY構(gòu)建數(shù)組類型
---1*4的一維數(shù)組test=#selectarray[1,2,3,4];
? array? -----------{1,2,3,4}
(1 row)--2*2的二維數(shù)組test=#selectarray[[1,2],[3,4]];
? ? array? ? ---------------{{1,2},{3,4}}
(1 row)--1*2的二維數(shù)組兄世,基本類型為box矩形類型啼辣,且和上面相比box類型元素之間是以分號(hào)分隔的,其他所有類型的數(shù)據(jù)都是以逗號(hào)分隔的test=#selectarray[box'(1,1),(0,0)',box'(0,0),(-1,-1)'];
? ? ? ? ? ? array? ? ? ? ? ? -----------------------------{(1,1),(0,0);(0,0),(-1,-1)}
(1row)
示例2.創(chuàng)建一張表御滩,字段包含數(shù)組類型
其中int[]表示數(shù)組長(zhǎng)度無(wú)限制鸥拧,int[4]表示數(shù)組長(zhǎng)度為4.
test=#createtabletbl_array(aint[],bvarchar(32)[][],cint);CREATETABLEtest=#insertintotbl_array (a,b,c)values(array[1,2],array[[1,2,3],[4,5,6]],1);INSERT01test=#insertintotbl_array (a,b,c)values(array[1,2,3],array[[1,2],[4,5]],2);INSERT01test=#select*from tbl_array ;
? ? a? ? |b| c ---------+-------------------+---{1,2}|{{1,2,3},{4,5,6}}|1 {1,2,3}|{{1,2},{4,5}}|2(2 rows)
test=#selecta[1],b[2]fromtbl_arraywherec=1;
a | b ---+---1|
(1 row)
test=#selecta[1],b[2][1]fromtbl_arraywherec=1;
a | b ---+---1|4(1 row)
test=#selecta[1],b[2][4]fromtbl_arraywherec=1;
a | b ---+---1|
(1row)
test=#updatetbl_arrayseta[1]=200wherea[1]=1;UPDATE1test=#selecta[1],b[2][4]from tbl_array ;
? a? | b -----+---100|200|
(2rows)
也可以使用[下標(biāo):上標(biāo)]方式來(lái)查詢數(shù)組連續(xù)的某些元素党远。
test=#selecta[2:3]from tbl_array ;
? a? -------{2}
{2,3}
(2 rows)
test=#selecta[1:3]from tbl_array ;
? ? a? ? -----------{100,2}
{200,2,3}
(2rows)
數(shù)組操作符與函數(shù)
操作符
操作符描述示例結(jié)果
=相等?SELECT ARRAY[1.1,2.1,3.1]::int[] = ARRAY[1,2,3];?t
<>不等于?select ARRAY[1,2,3] <> ARRAY[1,2,4];?t
<小于?select ARRAY[1,2,3] < ARRAY[1,2,4];?t
>大于?select ARRAY[1,4,3] > ARRAY[1,2,4];?t
<=小于或等于?select ARRAY[1,2,3] <= ARRAY[1,2,3];?t
>=大于或等于?select ARRAY[1,4,3] >= ARRAY[1,4,3];?t
@>包含?select ARRAY[1,4,3] @> ARRAY[3,1];?t
<@包含于?select ARRAY[2,7] <@ ARRAY[1,7,4,2,6];?t
&&重疊(是否有相同元素)?select ARRAY[1,4,3] && ARRAY[2,1];?t
||數(shù)組與數(shù)組連接?select ARRAY[1,2,3] || ARRAY[4,5,6];?{1,2,3,4,5,6}
||數(shù)組與數(shù)組連接?select ARRAY[1,2,3] || ARRAY[[4,5,6],[7,8,9]];?{{1,2,3},{4,5,6},{7,8,9}}
||元素與數(shù)組連接?select 3 || ARRAY[4,5,6];?{3,4,5,6}
||數(shù)組與元素連接?select ARRAY[4,5,6] || 7;?{4,5,6,7}
函數(shù)
函數(shù)返回類型描述示例結(jié)果
array_append(anyarray,anyelement)anyarray?在數(shù)組末尾追加元素?
SELECT array_append(ARRAY[1,2], 3);
?{1,2,3}
array_cat(anyarray,anyarray)anyarray?連接兩個(gè)數(shù)組?SELECT array_cat(ARRAY[1,2,3], ARRAY[4,5]);?{1,2,3,4,5}
array_ndims(anyarray)int?返回?cái)?shù)組維數(shù)?SELECT array_ndims(ARRAY[[1,2,3], [4,5,6]]);?2
array_dims(anyarray)text?返回?cái)?shù)組維數(shù)的文本表示?SELECT array_dims(ARRAY[[1,2,3], [4,5,6]]);?[1:2][1:3]
array_fill(anyelement,int[], [,int[]])anyarray使用提供的值和維度初始化一個(gè)數(shù)組,其中anyelement是值富弦,第一個(gè)int[]是數(shù)組的長(zhǎng)度沟娱,第二個(gè)int[]是數(shù)組下界,下界默認(rèn)是1?SELECT array_fill(7, ARRAY[3], ARRAY[2]);?[2:4]={7,7,7}
array_length(anyarray,int)int?返回?cái)?shù)組指定維度的長(zhǎng)度?SELECT array_length(array[1,2,3], 1);?3
array_lower(anyarray,int)int?返回?cái)?shù)組指定維度的下界?SELECT array_lower('[0:2]={1,2,3}'::int[], 1);?0
array_position(anyarray,anyelement[,int])int?返回?cái)?shù)組元素anyelement從數(shù)組的[,int]位置(默認(rèn)為1)開(kāi)始第一次出現(xiàn)在數(shù)組中的位置腕柜,數(shù)組必須是一維的?SELECT array_position(ARRAY['sun','mon','tue','wed','thu','fri','sat'], 'mon');?2
array_positions(anyarray,anyelement)int[]?返回元素在數(shù)組中的所有位置?SELECT array_positions(ARRAY['A','A','B','A'], 'A');?{1,2,4}
array_prepend(anyelement,anyarray)anyarray?在數(shù)組開(kāi)頭添加新的元素?SELECT array_prepend(1, ARRAY[2,3]);?{1,2,3}
array_remove(anyarray,anyelement)anyarray?從數(shù)組中刪除所有的指定元素济似,必須是一維數(shù)組?SELECT array_remove(ARRAY[1,2,3,2], 2);?{1,3}
array_replace(anyarray,anyelement,anyelement)anyarray?替換指定數(shù)組元素為新的元素?SELECT array_replace(ARRAY[1,2,5,4], 5, 3);?{1,2,3,4}
array_to_string(anyarray,text[,text])text?將數(shù)組元素使用分隔符連接為文本,NULL可以使用指定元素替換?SELECT array_to_string(ARRAY[1, 2, 3, NULL, 5], ',', '*');?1,2,3,*,5
array_upper(anyarray,int)int?數(shù)組指定維度的上屆?SELECT array_upper(ARRAY[1,8,3,7], 1);?4
cardinality(anyarray)int?返回?cái)?shù)組所有維度的長(zhǎng)度總和盏缤,如果是空數(shù)組則返回0?SELECT cardinality(ARRAY[[1,2],[3,4]]);?4
string_to_array(text,text[,text])text[]?將文本使用分隔符分隔后轉(zhuǎn)換為數(shù)組砰蠢,如果指定第三個(gè)參數(shù),則第三個(gè)參數(shù)在數(shù)組中被轉(zhuǎn)換為NULL?SELECT string_to_array('xx~^~yy~^~zz', '~^~', 'yy');?{xx,NULL,zz}
unnest(anyarray)setof anyelement?將數(shù)組元素轉(zhuǎn)換為行?SELECT unnest(ARRAY[1,2]);?
1
2
unnest(anyarray,anyarray[, ...])setof anyelement, anyelement [, ...]?將多維數(shù)組轉(zhuǎn)換為行集合唉铜,其中第一個(gè)數(shù)組顯示為第一列娩脾,第二個(gè)數(shù)組顯示為第二列,以此類推打毛。但是這個(gè)函數(shù)只在from子句中使用?SELECT * from unnest(ARRAY[1,2],ARRAY['foo','bar','baz']);?
unnest | unnest
--------+----
1 | foo
2 | bar
? | baz