postgresql----數組類型和函數


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,anyelementanyelement) 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
2

unnest(anyarrayanyarray[, ...]) setof anyelement, anyelement [, ...]  將多維數組轉換為行集合,其中第一個數組顯示為第一列,第二個數組顯示為第二列,以此類推。但是這個函數只在from子句中使用  SELECT * from unnest(ARRAY[1,2],ARRAY['foo','bar','baz']);  

unnest | unnest
--------+----
1 | foo
2 | bar
  | baz


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM