PostgreSQL数据类型——数组类型
admin
2024-02-28 21:16:32
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返回数组中的总元素数量,或者如果数组是空的则为0select 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

相关内容

热门资讯

linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
C++ 机房预约系统(六):学... 8、 学生模块 8.1 学生子菜单、登录和注销 实现步骤: 在Student.cpp的...
A.机器学习入门算法(三):基... 机器学习算法(三):K近邻(k-nearest neigh...
数字温湿度传感器DHT11模块... 模块实例https://blog.csdn.net/qq_38393591/article/deta...
有限元三角形单元的等效节点力 文章目录前言一、重新复习一下有限元三角形单元的理论1、三角形单元的形函数(Nÿ...
Redis 所有支持的数据结构... Redis 是一种开源的基于键值对存储的 NoSQL 数据库,支持多种数据结构。以下是...
win下pytorch安装—c... 安装目录一、cuda安装1.1、cuda版本选择1.2、下载安装二、cudnn安装三、pytorch...
MySQL基础-多表查询 文章目录MySQL基础-多表查询一、案例及引入1、基础概念2、笛卡尔积的理解二、多表查询的分类1、等...
keil调试专题篇 调试的前提是需要连接调试器比如STLINK。 然后点击菜单或者快捷图标均可进入调试模式。 如果前面...
MATLAB | 全网最详细网... 一篇超超超长,超超超全面网络图绘制教程,本篇基本能讲清楚所有绘制要点&#...
IHome主页 - 让你的浏览... 随着互联网的发展,人们越来越离不开浏览器了。每天上班、学习、娱乐,浏览器...
TCP 协议 一、TCP 协议概念 TCP即传输控制协议(Transmission Control ...
营业执照的经营范围有哪些 营业执照的经营范围有哪些 经营范围是指企业可以从事的生产经营与服务项目,是进行公司注册...
C++ 可变体(variant... 一、可变体(variant) 基础用法 Union的问题: 无法知道当前使用的类型是什...
血压计语音芯片,电子医疗设备声... 语音电子血压计是带有语音提示功能的电子血压计,测量前至测量结果全程语音播报࿰...
MySQL OCP888题解0... 文章目录1、原题1.1、英文原题1.2、答案2、题目解析2.1、题干解析2.2、选项解析3、知识点3...
【2023-Pytorch-检... (肆十二想说的一些话)Yolo这个系列我们已经更新了大概一年的时间,现在基本的流程也走走通了,包含数...
实战项目:保险行业用户分类 这里写目录标题1、项目介绍1.1 行业背景1.2 数据介绍2、代码实现导入数据探索数据处理列标签名异...
记录--我在前端干工地(thr... 这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前段时间接触了Th...
43 openEuler搭建A... 文章目录43 openEuler搭建Apache服务器-配置文件说明和管理模块43.1 配置文件说明...