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[],b[] from tbl_array where c = 1;
a | b
---+---
1 |
(1 row) test=# select a[],b[][] from tbl_array where c = 1;
a | b
---+---
1 | 4
(1 row) test=# select a[],b[][] from tbl_array where c = 1;
a | b
---+---
1 |
(1 row)
test=# update tbl_array set a[] = 200 where a[] = 1;
UPDATE 1
test=# select a[],b[][] 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,anyelement, anyelement) |
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 |
unnest(anyarray, anyarray[, ...]) |
setof anyelement, anyelement [, ...] | 将多维数组转换为行集合,其中第一个数组显示为第一列,第二个数组显示为第二列,以此类推。但是这个函数只在from子句中使用 | SELECT * from unnest(ARRAY[1,2],ARRAY['foo','bar','baz']); |
unnest | unnest |
postgresql----数组类型和函数的更多相关文章
- C++数组类型与函数类型
之所以将C++的数组类型与函数类型拿到一块说,是因为两者在很多地方都一样. 首先,声明形式上类似: 数组类型: type [num] ...
- PostgreSQL 数组类型
PostgreSQL 支持表的字段使用定长或可变长度的一维或多维数组,数组的类型可以是任何数据库内建的类型.用户自定义的类型.枚举类型, 以及组合类型.但目前还不支持 domain 类型. 数组类型的 ...
- 测试常用shell语句——数值,数组类型;函数创建
一.特殊类型的变量 shell下默认的变量类型为字符串类型 1,数值类型 如果进行数值运算,有这么几种方法 方法一: declare -i sum sum=+ echo $sum 方法二: sum=$ ...
- 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[] ...
- FCL源码中数组类型的学习及排序函数Sort函数的分析
Array 是所有数组的基类ArrayList 解决了所有Array 类的缺点 能动态扩容, 但是类型不安全的,而是会有装箱与拆箱的性能开销List<T> 则是解决了ArrayLis ...
- PostgreSQL学习手册(五) 函数和操作符
PostgreSQL学习手册(五) 函数和操作符 一.逻辑操作符: 常用的逻辑操作符有:AND.OR和NOT.其语义与其它编程语言中的逻辑操作符完全相同. 二.比较操作符: 下面是Post ...
- JavaScript数组类型
特点 动态长度 一个数组里面的元素可以是不同类型 数组的length属性不是只读属性,可通过length延长数组也可以删减数组的长度 定义数组两种方法 //方法一: var names = new A ...
随机推荐
- [转]油猴Tampermonkey-让百度云下载飞起来
1. 简介 Tampermonkey,油猴脚本是一款免费的浏览器扩展程序. 我们这里用于Chrome浏览器,目的是为了让百度云里面的文件以满速下载,VIP还得出钱呢. 2. 安装 安装Lantern蓝 ...
- 使用a标签制作tooltips
摘要: 前面已经分享了三种方法制作tooltips,今天再来分享一个借助a标签来实现tooltips的方法. 效果如下:
- git同时提交到两个仓库
有时候一个项目,希望既提交到oschina又提交到公司内网的gitlab,或者是github什么的. 使用git remote -v 查看当前git的远程仓库. 添加一个远程仓库 git remote ...
- 8 -- 深入使用Spring -- 3...1 Resource实现类InputStreamResource、ByteArrayResource
8.3.1 Resource实现类------InputStreamResource:访问输入流资源的实现类.ByteArrayResource:访问字节数组资源的实现类. 5. 访问字节数组资源 ⊙ ...
- Python中的and/or
在Python中,可以通过and,or和not进行逻辑运算,下面就来看看and和or的简单介绍. 逻辑与-and 对于包含and运算的表达式,Python解释器将从左到右扫描,返回第一个为假的表达式值 ...
- C#反射基础理解1(转)
反射提供了封装程序集.模块和类型的对象(Type类型) 可以使用反射动态的创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型,然后,可以调用类型的方法或访问其字段和属性 . 总之,有了反射, ...
- PHP代码审计笔记--代码执行漏洞
漏洞形成原因:客户端提交的参数,未经任何过滤,传入可以执行代码的函数,造成代码执行漏洞. 常见代码注射函数: 如:eval.preg_replace+/e.assert.call_user_func. ...
- WAF Bypass FUZZ小脚本
分享两个小脚本,用来WAF Bypass简单FUZZ的 第一个:先生成一个字典,带入搭建的环境进行FUZZ,针对某些软WAF挺好用的,可FUZZ出不少姿势出来,记得先把CC攻击加入白名单才行哦... ...
- java serialize 浅谈
对象的串行化(Serialization) 一.串行化的概念和目的 1.什么是串行化 对象的寿命通常随着生成该对象的程序的终止而终止.有时候,可能需要将对象的状态保存下来,在需要时再将对象恢复.我们把 ...
- 系统头文件cmath,cstdlib报错
>C:\Program Files (x86)\Microsoft Visual Studio\\Community\VC\Tools\MSVC\\include\cstdlib(): erro ...