PostgreSQL数据类型——数组类型

发布于:2023-09-14 ⋅ 阅读:(130) ⋅ 点赞:(0)

PostgreSQL数据类型——数组类型

实际工作中并不是所有业务都会使用这些类型,但是在查询数据过程中过滤某些数据的时候,我们可以将一些条件,转换成这些特殊的数据格式,通过这些数据格式对应的函数,来实现一些复杂条件才能实现的过滤。

版本为9.6版本

在PostgreSQL中每种数据类型都有相应的基础的数组类型

定义数组类型

将一个字段设置为数组类型只需要在其基本类型后添加[]即可。

create table test_arr (
	id integer,
	arr_int integer[],
	arr_text text[]
)

如何插入数组类型

数组类型数据插入支持两种方式。

  1. 使用{}包裹数组内容,使用,对元素进行分割。类型下面样子
insert into test_arr (id,arr_int,arr_text)
values(1,'{1,2,3}','{"test1","test2","test3"}')
  1. 使用array将数据转换为数组
insert into test_arr (id,arr_int,arr_text)
values(2,array[1,2,3],array['test1','test2','test3'])

如何查询数组类型

数组字段支持在字段后面添加索引来查询数组中指定索引的数据类型这样。如果指定索引超过数组长度,则返回null。

select arr_int[1],arr_text[2],arr_text[4] from test_arr

数组类型操作符

PostgreSQL 提供了下面的操作类实现数组间的处理或者判断

操作符 描述 例子 结果
= 等于 ARRAY[1.1,2.1,3.1]::int[] = ARRAY[1,2,3] true
<> 不等于 ARRAY[1,2,3] <> ARRAY[1,2,4] true
< 小于 ARRAY[1,2,3] < ARRAY[1,2,4] true
> 大于 ARRAY[1,4,3] > ARRAY[1,2,4] true
<= 小于或等于 ARRAY[1,2,3] <= ARRAY[1,2,3] true
>= 大于或等于 ARRAY[1,4,3] >= ARRAY[1,4,3] true
@> 包含 ARRAY[1,4,3] @> ARRAY[3,1] true
<@ 被包含于 ARRAY[2,7] <@ ARRAY[1,7,4,2,6] true
&& 重叠(有共同元素) ARRAY[1,4,3] && ARRAY[2,1] true
|| 数组与数组连接 ARRAY[1,2,3] || ARRAY[4,5,6] {1,2,3,4,5,6}
|| 数组与数组连接 ARRAY[1,2,3] || ARRAY[[4,5,6],[7,8,9]] {{1,2,3},{4,5,6},{7,8,9}}
|| 元素与数组连接 3 || ARRAY[4,5,6] {3,4,5,6}
|| 数组与元素连接 ARRAY[4,5,6] || 7 {4,5,6,7}

数组相关函数

PostgreSQL 提供了一些的函数来帮助我们对数组进行处理

内容的修改

这些内容主要是针对数组类型的返回结果进行处理

函数 说明 语句 结果
array_append 向数组的末尾添加元素 array_append(ARRAY[1,2], 3) {1,2,3}
array_prepend 向数组的开头添加函数 array_prepend(1, ARRAY[2,3]) {1,2,3}
array_cat 连接两个数组 array_cat(ARRAY[1,2,3], ARRAY[4,5]) {1,2,3,4,5}
array_replace 用新值替换每个等于给定值的数组元素 array_replace(ARRAY[1,2,5,4], 5, 3) {1,2,3,4}
[start:end] [2:4] select arr_text[1:2] from test_arr {‘test2’,‘test3’}

数组信息查询

这部分函数主要是对数组数据的源数据进行查询

函数 说明 语句 结果
array_dims 返回数组维数的文本表示 array_dims(ARRAY[[1,2,3], [4,5,6]]) [1:2][1:3]
array_lower 返回数组维数的下界 array_lower(‘[0:2]={1,2,3}’::int[], 1) 0
array_upper 返回数组维数的上界 array_upper(ARRAY[1,8,3,7], 1) 4
array_ndims 返回数组的维数 array_ndims(ARRAY[[1,2,3], [4,5,6]]) 2
array_length 返回数组维度的长度 array_length(array[1,2,3], 1) 3
array_position 数组中指定元素出现的位置 array_position(ARRAY[1,8,3,7], 8) 2
cardinality 返回数组中的总元素数量,或者如果数组是空的则为0 select cardinality(ARRAY[1,2,3,5]) 4

转换

这里面的函数提供了数组和字符串的转换,在实际应用中,这部分的逻辑使用的会比较多。很多时候一些查询中我们数据类型是个字符串,但是符合数组的结构特征,我们希望以数组的特性去操作这个字符串,这里面的函数无疑是必要的。

函数 说明 语句 结果
array_to_string 将数组转换为字符串,使用分隔符和null字符串连接数组元素 select array_to_string(ARRAY[1, 2, 3, NULL, 5], ‘,’, ‘N’) 1,2,3,N,5
string_to_array 使用指定的分隔符和null字符串把字符串分裂成数组元素 string_to_array(‘A,B,C,D’,‘,’) {A,B,C,D}

结果转换

这部分的参数,会将数组结果进行合并和展开。

函数 说明 语句 结果
array_agg 把多个值合并到一个数组中 SELECT case_id, array_agg(case_label) as case_label FROM case_label WHERE group by case_id [1:2][1:3]
unnest 扩大一个数组为一组行 select unnest(ARRAY[1,2,3,4]) 1
2
3
4

unnest

如果一个查询中多个字段使用unnest,则每行都会被展开类似这样

select unnest(ARRAY[1,2,3,4]), unnest(ARRAY['A','B','C','D']) 

1	A
2	B
3	C
4	D

但是如果数组元素数量不一致,会出现类似笛卡儿积的结果

select unnest(ARRAY[1,2,3,4]), unnest(ARRAY['A','B','C']) 

1	A
2	B
3	C
4	A
1	B
2	C
3	A
4	B
1	C
2	A
3	B
4	C