postgresql支持數組類型,可以是基本類型,也可以是用戶自定義的類型。日常中使用數組類型的機會不多,但還是可以了解一下。不像C或JAVA高級語言的數組下標從0開始,postgresql數組下標從1開始,既可以指定長度,也可以不指定長度。且postgresql既支持一維數組,也支持多維數組,但是平時二維數組也就夠用了。
示例1.使用ARRAY構建數組類型
---1*4的一維數組 test=# select array[1,2,3,4]; array ----------- {1,2,3,4} (1 row) --2*2的二維數組 test=# select array[[1,2],[3,4]]; array --------------- {{1,2},{3,4}} (1 row) --1*2的二維數組,基本類型為box矩形類型,且和上面相比box類型元素之間是以分號分隔的,其他所有類型的數據都是以逗號分隔的 test=# select array[box'(1,1),(0,0)',box'(0,0),(-1,-1)']; array ----------------------------- {(1,1),(0,0);(0,0),(-1,-1)} (1 row)
示例2.創建一張表,字段包含數組類型
其中int[]表示數組長度無限制,int[4]表示數組長度為4.
test=# create table tbl_array(a int[],b varchar(32)[][],c int); CREATE TABLE test=# insert into tbl_array (a,b,c) values (array[1,2],array[[1,2,3],[4,5,6]],1); INSERT 0 1 test=# insert into tbl_array (a,b,c) values (array[1,2,3],array[[1,2],[4,5]],2); INSERT 0 1 test=# 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=# select a[1],b[2] from tbl_array where c = 1; a | b ---+--- 1 | (1 row) test=# select a[1],b[2][1] from tbl_array where c = 1; a | b ---+--- 1 | 4 (1 row) test=# select a[1],b[2][4] from tbl_array where c = 1; a | b ---+--- 1 | (1 row)
test=# update tbl_array set a[1] = 200 where a[1] = 1; UPDATE 1 test=# select a[1],b[2][4] from tbl_array ; a | b -----+--- 100 | 200 | (2 rows)
也可以使用[下標:上標]方式來查詢數組連續的某些元素。
test=# select a[2:3] from tbl_array ; a ------- {2} {2,3} (2 rows) test=# select a[1:3] from tbl_array ; a ----------- {100,2} {200,2,3} (2 rows)
數組操作符與函數
操作符
操作符 | 描述 | 示例 | 結果 |
= | 相等 | 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 |
|| | 數組與數組連接 | select ARRAY[1,2,3] || ARRAY[4,5,6]; | {1,2,3,4,5,6} |
|| | 數組與數組連接 | select ARRAY[1,2,3] || ARRAY[[4,5,6],[7,8,9]]; | {{1,2,3},{4,5,6},{7,8,9}} |
|| | 元素與數組連接 | select 3 || ARRAY[4,5,6]; | {3,4,5,6} |
|| | 數組與元素連接 | select ARRAY[4,5,6] || 7; | {4,5,6,7} |
函數
函數 | 返回類型 | 描述 | 示例 | 結果 |
array_append (anyarray,anyelement) |
anyarray | 在數組末尾追加元素 | SELECT array_append(ARRAY[1,2], 3); |
{1,2,3} |
array_cat (anyarray,anyarray) |
anyarray | 連接兩個數組 | SELECT array_cat(ARRAY[1,2,3], ARRAY[4,5]); | {1,2,3,4,5} |
array_ndims (anyarray) |
int | 返回數組維數 | SELECT array_ndims(ARRAY[[1,2,3], [4,5,6]]); | 2 |
array_dims (anyarray) |
text | 返回數組維數的文本表示 | SELECT array_dims(ARRAY[[1,2,3], [4,5,6]]); | [1:2][1:3] |
array_fill (anyelement,int[], [, int[]]) |
anyarray | 使用提供的值和維度初始化一個數組,其中anyelement是值,第一個int[]是數組的長度,第二個int[]是數組下界,下界默認是1 | SELECT array_fill(7, ARRAY[3], ARRAY[2]); | [2:4]={7,7,7} |
array_length (anyarray,int) |
int | 返回數組指定維度的長度 | SELECT array_length(array[1,2,3], 1); | 3 |
array_lower (anyarray,int) |
int | 返回數組指定維度的下界 | SELECT array_lower('[0:2]={1,2,3}'::int[], 1); | 0 |
array_position (anyarray,anyelement [, int]) |
int | 返回數組元素anyelement從數組的[,int]位置(默認為1)開始第一次出現在數組中的位置,數組必須是一維的 | SELECT array_position(ARRAY['sun','mon','tue','wed','thu','fri','sat'], 'mon'); | 2 |
array_positions (anyarray,anyelement) |
int[] | 返回元素在數組中的所有位置 | SELECT array_positions(ARRAY['A','A','B','A'], 'A'); | {1,2,4} |
array_prepend (anyelement,anyarray) |
anyarray | 在數組開頭添加新的元素 | SELECT array_prepend(1, ARRAY[2,3]); | {1,2,3} |
array_remove (anyarray,anyelement) |
anyarray | 從數組中刪除所有的指定元素,必須是一維數組 | SELECT array_remove(ARRAY[1,2,3,2], 2); | {1,3} |
array_replace (anyarray,anyelement, anyelement) |
anyarray | 替換指定數組元素為新的元素 | SELECT array_replace(ARRAY[1,2,5,4], 5, 3); | {1,2,3,4} |
array_to_string (anyarray,text [, text]) |
text | 將數組元素使用分隔符連接為文本,NULL可以使用指定元素替換 | SELECT array_to_string(ARRAY[1, 2, 3, NULL, 5], ',', '*'); | 1,2,3,*,5 |
array_upper (anyarray,int) |
int | 數組指定維度的上屆 | SELECT array_upper(ARRAY[1,8,3,7], 1); | 4 |
cardinality (anyarray) |
int | 返回數組所有維度的長度總和,如果是空數組則返回0 | SELECT cardinality(ARRAY[[1,2],[3,4]]); | 4 |
string_to_array (text,text [, text]) |
text[] | 將文本使用分隔符分隔后轉換為數組,如果指定第三個參數,則第三個參數在數組中被轉換為NULL | SELECT string_to_array('xx~^~yy~^~zz', '~^~', 'yy'); | {xx,NULL,zz} |
unnest (anyarray) |
setof anyelement | 將數組元素轉換為行 | SELECT unnest(ARRAY[1,2]); | 1 |
unnest (anyarray, anyarray[, ...]) |
setof anyelement, anyelement [, ...] | 將多維數組轉換為行集合,其中第一個數組顯示為第一列,第二個數組顯示為第二列,以此類推。但是這個函數只在from子句中使用 | SELECT * from unnest(ARRAY[1,2],ARRAY['foo','bar','baz']); | unnest | unnest |