前言

最近在学习postgreSQL,发现 postgre 支持数组类型,闲着无聊整理了一些数组类型的用法。目前处于探索阶段。

1 创建表

CREATE TABLE test ( ID serial PRIMARY KEY, phone int4 [] );

查看表结构显示phone字段type:integer[]

postgres=# \d testTable "public.test"Column |   Type    | Collation | Nullable |             Default
--------+-----------+-----------+----------+----------------------------------id     | integer   |           | not null | nextval('test_id_seq'::regclass)phone  | integer[] |           |          |
Indexes:"test_pkey" PRIMARY KEY, btree (id)
注:在Navicat中会显示不出来数组类型,如下:

2 插入数据

1.数据插入有两种方式,如下:
insert into test(phone) values ('{1,2}');
insert into test(phone) values ('{2,3}');
insert into test(phone) values (array[3,4,5]);
insert into test(phone) values (array[1,2,3]);
insert into test(phone) values (array[1]);
postgres=# select * from test;id |  phone
----+---------1 | {1,2}2 | {2,3}3 | {3,4,5}4 | {1,2,3}5 | {1}

3 查询

3.1 在数组中搜索

SELECT * FROM test WHERE 10000 = ANY (phone);
SELECT * FROM test WHERE 10000 = ALL (phone);

这个两个写法有局限性,只能匹配查询1个元素。尤其是All函数,相当于完全匹配10000这个元素,包含10000的不算。(或者还有更高级的写法,暂时没去探索)

3.2 数组函数和操作符

数组操作符

操作符 描述 例子 结果
= 等于 ARRAY[1.1,2.1,3.1] :: int[ ] = ARRAY[1,2,3] t
<> 不等于 ARRAY[1,2,3] <> ARRAY[1,2,4] t
< 小于 ARRAY[1,2,3] < ARRAY[1,2,4] t
> 大于 ARRAY[1,4,3] > ARRAY[1,2,4] t
<= 小于等于 ARRAY[1,2,3] <= ARRAY[1,2,3] t
>= 大于等于 ARRAY[1,4,3] >= ARRAY[1,4,3] t
@> 包含 ARRAY[1,4,3] @> ARRAY[3,1] t
<@ 被包含 ARRAY[2,7] <@ ARRAY[1,7,4,2,6] t
&& 重叠(具有公共元素) ARRAY[1,4,3] && ARRAY[2,1] t
|| 数组和数组串接 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}

3.3 数组元素查询

3.3.1 查询包含: phone中包含 [1, 2]两个元素的记录

postgres=# SELECT * FROM test WHERE  phone @> array[1,2];id |  phone
----+---------1 | {1,2}4 | {1,2,3}
(2 rows)

3.3.2 查询包含: phone中包含1或包含2的记录

postgres=# SELECT * FROM test WHERE phone && array[1,2];id |  phone
----+---------1 | {1,2}2 | {2,3}4 | {1,2,3}5 | {1}
(4 rows)

注意
如果phone字段类型为 bigint[] ,当查询 3.3.2 的语句会报错:

postgres=# SELECT * FROM test_array WHERE phone && array[1,2];
ERROR:  operator does not exist: bigint[] && integer[]
LINE 1: SELECT * FROM test_array WHERE phone && array[1,2];^
HINT:  No operator matches the given name and argument types. You might need to add explicit type casts.
postgres=#

所以需要类型转换:

postgres=# SELECT * FROM test_array WHERE phone && array[1,2] :: bigint[];id |  phone
----+---------1 | {1,2}2 | {2,3}4 | {1,2,3}5 | {1}
(4 rows)

4 修改数组

4.1 整个替换

postgres=# update test set phone ='{5,6}' where id =5;
UPDATE 1
--  或者使用 `ARRAY` 表达式语法
postgres=# update test set phone =array[7,8] where id =5;
UPDATE 1

4.2 更新单个元素

postgres=# update test set phone[1]='3' where id =5;
UPDATE 1

4.3 更新一个切片上的元素

postgres=# update test set phone[1:2 ]= '{2,3}' where id =5;
UPDATE 1

注意:
1.指定下标更新,数组越界部分会扩充并且补充空值。例如:一个数组arr有2个元素,现在更新arr[4],则arr[3]为空值,采用这种方式扩大数组只允许使用在一维数组上
2.带下标的赋值方式允许创建下标不是从1开始的数组。例如:我们可以为arr[-2:7]赋值来创建一个下标值从-2到7的数组。


其他

1 postgre 支持多维数组,并且允许指定数组的确切大小

CREATE TABLE test_arr(id            bigserial,schedule      text[][],squares       integer[3][3]
);

2 默认情况下,数组的下标是从 1 开始的,但也可以指定下标的开始值,如下:

postgres=# select phone[1] from test where id =1;phone
-------1
(1 row)

另外可以查询所有记录第一个元素,去掉上面 where 条件就可以:

postgres=# select phone[1] from test;phone
-------12311
(5 rows)
-- 或可以使用数组的切片:
postgres=# SELECT id, phone[1:2] FROM test;id | phone
----+-------1 | {1,2}2 | {2,3}3 | {3,4}4 | {1,2}5 | {1}
(5 rows)

文档

官方文档
中文文档

postgre 数组类型相关推荐

  1. mobx使用数组提示越界_Mobx-State-Tree-分配给数组类型

    Mobx-State-Tree-分配给数组类型,会提示Type 'string[]' is not assignable to type 'IMSTArray> & IStateTree ...

  2. 给出一种符号表的组织方式和结构设计,要考虑数组类型和函数(不得与课件上的雷同)

    给出一种符号表的组织方式和结构设计,要考虑数组类型和函数(不得与课件上的雷同) 给出一种符号表的组织方式和结构设计,要考虑数组类型和函数(不得与课件上的雷同) 符号表的组织方式和结构设计: nameT ...

  3. js基础(数组)--数组类型、类数组对象、作为数组的字符串

    1.数组类型 我们到处都可以看见数组是具有特殊行为的对象.给定一个未知的对象,判定它是否为数组通常非常 有用.在ECMAScript 5中,可以使用Array.isArray()函数来做这件事情:Ar ...

  4. 【C 语言】数组 ( 数组指针 | 数组指针定义 | 使用 数组类型* 定义数组指针 )

    文章目录 总结 一.使用 数组类型* 定义数组指针 二.完整代码示例 总结 typedef int(ArrayType)[3];ArrayType *p = NULL; 一.使用 数组类型* 定义数组 ...

  5. 【C 语言】数组 ( 数组类型表达 | 定义数组类型 )

    文章目录 总结 一.数组类型表达 二.定义数组类型 三.代码示例 总结 // 定义类数组数据类型 int [10] , 类型别名为 ArrayTypetypedef int (ArrayType)[1 ...

  6. 测试常用shell语句——数值,数组类型;函数创建

    一.特殊类型的变量 shell下默认的变量类型为字符串类型 1,数值类型 如果进行数值运算,有这么几种方法 方法一: declare -i sum sum=100+200 echo $sum方法二: ...

  7. Java进阶知识-数组类型

    前言 本来数组类型应该属于基础部分的知识,我将它写在进阶部分是因为数组既可以是基础数据类型数组,也可以是引用数据类型数组.所以我想先介绍完类与对象的基础之后,再给大家介绍数组.于是,今天这篇内容给大家 ...

  8. 全面讲解Python列表数组(三)列表数组类型的内置函数方法

    列表数组类型的内置函数方法 这里有一个列表 list1[1,2,3,4,1,5,6,7,8,9] 一, count() list1.count(1) 2 作用是计算列表一个元素出现的次数; 二. in ...

  9. C语言数组类型、数组指针类型、数组指针类型变量

    C语言数组类型.数组指针类型.数组指针类型变量 数组类型 数组指针类型 数组指针用于指向一个数组 数组指针:用数组类型加*定义一个数组指针 数组指针:定义一个数组指针类型,然后用类型定义变量 数组指针 ...

最新文章

  1. libevent介绍
  2. c++ssh连接_一步步使SSH连接您的github仓库
  3. js中的true,false盲点
  4. 函数组合的 N 种模式
  5. Django从理论到实战(part16)--指定默认的参数
  6. 网站如何集成百度UEditor编辑器
  7. 有没有查计算机组成的答案得,计算机组成答案.doc
  8. 手把手教你做数据产品经理
  9. Linux系统里如何重装ibus,Linux下安装ibus-rime的方法
  10. Mysql: 图解 inner join、left join、right join、full outer join、union、union all的区别
  11. 用Linux命令行实现删除和复制指定类型的文件
  12. php判断是字符串类型,php使用strpos判断字符串中数字类型子字符串出错的解决方法 原创...
  13. 7种JS脚本分页代码 showPages v1.0
  14. 网页上html表格如何导出excel,(将html网页导出excel表格数据库)如何将网页表格导出到excel...
  15. [DataAnalysis]机器学习数据类型和数据质量
  16. WQ7033开发指南(按键篇)之4.4 三轴加速度传感器SC7A20实现双击、三击驱动详解
  17. 如何在自己设置家里的路由器DNNS,并实现远程管理路由器。
  18. Linux中tar和scp
  19. MATLAB图形标注
  20. FCFS磁盘调度算法(C语言实现)

热门文章

  1. ArcGIS精美中国地图制作(详解)
  2. [Power Query]数据转置与反转行
  3. Junit5系列-什么是Junit5?
  4. sr算法matlab,超分辨率 SRCNN
  5. arch-linux+xfce4+lightdm+uefi个人安装记录
  6. 【目标追踪】三帧差法原理及实现
  7. php实现二级下拉菜单,jquery,_用jquery实现二级下拉菜单,jquery - phpStudy
  8. 小白在学习编程的道路上该如何杀出一条血路
  9. R数据分析实战——奥运会120年历史
  10. ASP中利用OWC控件实现图表功能详解