PostgreSQL 数组类型
PostgreSQL 支持表的字段使用定长或可变长度的一维或多维数组,数组的类型可以是任何数据库内建的类型、用户自定义的类型、枚举类型,
以及组合类型。但目前还不支持 domain 类型。
数组类型的定义就是通过在数组元素类型名后面附加中括号 [] 来实现的,中括号中可以给一个长度数字,也可以不给,
定义指定多维数组的维度也是没有意义的,数组的维度是根据实际插入的数据来确定的,如下两个语句意义是一样的:
CREATE TABLE test1 (id int, col1 int[], col2 int[], col3 text[][]); CREATE TABLE test2 (id int, col1 int[], col2 int[], col3 text[]);
如何输入数组值
可以使用 ARRAY 构造器语法输入数据,一个数组构造器是一个表达式,它从自身的成员上构造一个数组值。
一个简单的数组构造器由关键字 ARRAY、[、一个或多个表示数组元素值的表达式(用逗号分隔)、] 组成
INSERT INTO test values(, ARRAY['os', 'dba']); INSERT INTO test values(, ARRAY['os"dba', '123"456']); INSERT INTO test values(, ARRAY['os''dba', '''']); // 多维数组,在向多维数组插入值时,各个维度的元素个数必须相同,否则会报错
INSERT INTO test values(, ARRAY[['os', 'dba'],['dba', 'os']]);
访问数组
默认情况下,数组的下标是从 1 开始的,但也可以指定下标的开始值,如下:
CREATE TABLE test02 (id int[]); INSERT INTO test02 values('[2:4] = {1, 2, 3}'); SELECT id[], id[], id[] FROM test02;
指定上下标的格式为:
'[下标:上标] = [元素值1,元素值2,元素值3,...]'
可以使用数组的切片,如下所示:
SELECT id, col[:] FROM test02;
数组的操作符
数组类型支持一些集合关系的操作符,如下所示:
@> 包含
ARRAY[1, 2, 3] @> ARRAY[1, 2]
结果:t
ARRAY[1, 2, 3] @> ARRAY[1, 4]
结果:f
ARRAY[1, 2, 3] @> ARRAY[2, 1]
结果:t
ARRAY[[1, 2, 3]] @> ARRAY[[1, 2], [2, 3]]
结果:t
<@ 被包含于
ARRAY[1, 2] <@ ARRAY[1, 2, 3]
结果:t
ARRAY[2, 1] <@ ARRAY[1, 2, 3]
结果:t
ARRAY[1, 4] <@ ARRAY[1, 2, 3]
结果:t
ARRAY[[1, 2], [2, 4]] <@ ARRAY[1, 2, 3]
结果:f
&& 重叠,是否有共同元素
ARRAY[1, 2, 3] && ARRAY[3, 4]
结果:t
ARRAY[[1, 2], [3, 4]] && ARRAY[4, 5]
结果:t
ARRAY[1, 2] && ARRAY[3, 4]
结果:f
做集合比较时,不管数组中的元素在哪一维,都可以把它们当作集合中的一个元素,而与数组的维度没有关系。
连接操作符 “||”
同维度的数组与数组连接
ARRAY[1, 2] || ARRAY[3, 4]
结果:{1,2,3,4}
ARRAY[1, 2] || ARRAY[2, 3]
结果:{1,2,2,3}
不同维度的数组与数组连接
ARRAY[1, 2] || ARRAY[[3, 4], [5, 6]]
结果:{{1, 2}, {3, 4}, {5, 6}}
元素与数组之间的连接
1 || ARRAY[2, 3]
结果:{1, 2, 3}
ARRAY[2, 3] || 1
结果:{2, 3, 1}
1 || ARRAY[[2, 3]]
结果:报错
数组的函数
array_cat(anyarray, anyarray)
连接两个数组,返回新数组
示例:array_cat(ARRAY[1, 2], ARRAY[3, 4]) 结果:{1, 2, 3, 4}
array_cat(ARRAY[[1, 2]], ARRAY[3, 4]) 结果:{{1, 2}, {3, 4}}
array_cat(ARRAY[[1, 2]], ARRAY[[3, 4]]) 结果:{{1, 2}, {3, 4}}
array_ndims(anyarray)
返回数组的维度,返回值类型为 int
示例:array_ndims(ARRAY[1, 2, 3]) 结果:1
array_ndims(ARRAY[[1, 2, 3]]) 结果:2
array_ndims(ARRAY[[1, 2, 3], [4, 5, 6]]) 结果:2
array_ndims(ARRAY[[[1, 2, 3]]]) 结果:3
array_length(anyarray, int)
返回数组指定维度的长度,维度数是有由第二个参数指定的
示例: array_length(ARRAY[1, 2, 4], 1) 结果:3
array_length(ARRAY[[1, 2], [3, 4], [5, 6]], 1) 结果:3
array_length(ARRAY[[1, 2], [3, 4], [5, 6]], 2) 结果:2
array_lower(anyarray, int)
返回数组的下标
array_upperer(anyarray, int)
返回数组的上标
array_prepend(anyelement, anyarray)
在数组的开头插入一个元素
示例: array_prepend(7, ARRAY[8, 9]) 结果:{7, 8, 9}
array_remove(anyarray, anyelement)
移除数组中为指定值的元素,只支持一维数组
示例: array_remove(ARRAY[1, 2, 3], 2) 结果: {1, 3}
array_remove(ARRAY[1, 2, 3, 2, 1, 2], 2) 结果: {1, 3. 1}
array_replace(anyarray, anyelement, anyelement)
把数组中等于指定值元素的值用另一个指定值替代
示例: array_replace(ARRAY[1, 4, 3], 4, 2) 结果:{1,2,3}
array_to_string(anyarray, text)
使用指定的分隔符(第二个参数) 将数组元素连接为字符串
示例: array_to_string(ARRAY[1,2,3], ',') 结果:'1,2,3'
string_to_array(text, text)
用指定的分隔符分隔的字符串转成数组
示例:string_to_array('1,2,3', ',') 结果:{1, 2, 3}
unnest(anyarray)
把数组变成多行返回
array_agg(字段)
聚合函数
转发请著名出处:https://www.cnblogs.com/ryanzheng/p/9610182.html
PostgreSQL 数组类型的更多相关文章
- PostgreSQL数组类型应用
在使用 awk 脚本:数组是一大利器:在很多场景是用数组能处理. 在 python 中,数据类型list:相当于array类型. 在 Oracle 中,对 array 不够友好,感觉像是鸡肋.但是在 ...
- postgresql —— 数组类型
创建数组 CREATE TABLE sal_emp ( name text, pay_by_quarter integer[] --还可以定义为integer[4]或integer ARRAY[4] ...
- PostgreSQL Array 数组类型与 FreeSql 打出一套【组合拳】
前言 PostgreSQL 是世界公认的功能最强大的开源数据库,除了基础数据类型 int4/int8/varchar/numeric/timestamp 等数据类型,还支持 int4[]/int8[] ...
- mybatis 处理数组类型及使用Json格式保存数据 JsonTypeHandler and ArrayTypeHandler
mybatis 比 ibatis 改进了很多,特别是支持了注解,支持了plugin inteceptor,也给开发者带来了更多的灵活性,相比其他ORM,我还是挺喜欢mybatis的. 闲言碎语不要讲, ...
- java中用spring实现数组类型输出
java 中的几个数组类型 1.Department类 package com.yy.collection; import java.util.List; import java.util.Map; ...
- JS数组类型检测
在强类型语言,数组类型检测是非常容易的事情(typeof就可以解决),而在弱语言JS数据类型就很容易混淆了. JS中常见的数据类型有:number.string.boolean.undefined.f ...
- C语言 数组类型与数组指针类型
//数组类型与数组指针类型 #include<stdio.h> #include<stdlib.h> #include<string.h> void main(){ ...
- delphi 数组类型与数组指针的巧妙利用
{本例通过存取结构, 慢慢引入了数组类型与指针的一些使用方法; 其中六个小例子的测试内容和结果都是一样的. ---------------------------------------------- ...
- delphi 数组类型
数组类型 数组类型定义了一组指定类型的元素序列,在方括号中填入下标值就可访问数组中的元素.定义数组时,方括号也用来指定可能的下标值.例如,下面的代码中定义了一个有 24 个整数的数组:type ...
随机推荐
- Reduce侧连接
1.reduce side join 在reduce端进行表的连接,该方法的特点就是操作简单,缺点是map端shffule后传递给reduce端的数据量过大,极大的降低了性能 连接方法: (1)map ...
- WebUploader实现采集图片的功能
项目最开始用百度团队的文件上传组件做了个物料照片采集的功能,后来做员工头像采集时竟然不知道怎么使用了. 参照官方Demo: http://fex.baidu.com/webuploader/getti ...
- 最简单的基于FFMPEG的转码程序 —— 分析
模块: libavcodec - 编码解码器 libavdevice - 输入输出设备的支持 libavfilter - 视音频滤镜支持 ...
- Android(java)学习笔记91:Eclipse中代码提示去掉@override,不然就报错!
1. Eclipse中提示去掉@Override 把项目下载下来后有@Override的注释的方法会报错,如果把@Override去掉就不报错了.经过查阅后发现:@override注释在jdk1.5环 ...
- 18课 Vue第一节
Q1: url-loader必须搭载file-loader?Q2: 图片的打包问题,如果直接写在img标签里用src引用图片,该如何打包?Q3: 如何根据不同的页面html模板打包与之对应的css/j ...
- 一次线上CPU高的问题排查实践
一次线上CPU高的问题排查实践 前言 近期某一天上班一开电脑,就收到了运维警报,有两台服务CPU负载很高,同时收到一线同事反馈 系统访问速度非常慢,几乎无响应. 一个美好的早晨,最怕什么就来什么.只好 ...
- 通过Tcode查找Badi或者客户出口
https://wiki.scn.sap.com/wiki/display/ABAP/Code+To+Find+BAdi Created by Naresh Reddy K, last modifie ...
- python 输入英语单词,查看汉语意思
# -*- coding:utf-8 -*- import urllib2 import lxml.html as HTML def get_wordmean(): url = 'http://www ...
- JavaScript 循环
for循环: 如果您希望一遍又一遍运行相同的代码,并且每次的值都不同,那么使用循环是很方便的. 我们可以这样输出数组的值: document.write(cars[0] + "<br ...
- tp5 修改自带success或error跳转模板页面
tp5 修改自带success或error跳转模板页面 我们在使用tp5或者tp3.2的时候,用的成功或者失败跳转提示页面一般是用框架的.在后续开发过程中,根据实际项目需要,也是可以更改的,在此分享一 ...