专业只做数据库实训和认证的品牌机构

微信公众号新浪微博
免费咨询电话:400-0909-964
当前位置: 网站首页 > postgresql > 教程 > PostgreSQL教程 -》数据类型 -》修改数组

PostgreSQL教程 -》数据类型 -》修改数组

文章来源: 更新时间:2023/12/11 16:01:53

在线老师点击咨询:

最新学讯:近期OCP认证正在报名中,因考试人员较多请尽快报名获取最近考试时间,报名费用请联系在线老师,甲骨文官方认证,报名从速!

我要咨询

8.15.4. 修改数组

一个数组值可以被整个替换:

UPDATE sal_emp SET pay_by_quarter = '{25000,25000,27000,27000}'

WHERE name = 'Carol';

或者使用ARRAY表达式语法:

UPDATE sal_emp SET pay_by_quarter = ARRAY[25000,25000,27000,27000]

WHERE name = 'Carol';

一个数组也可以在一个元素上被更新:

UPDATE sal_emp SET pay_by_quarter[4] = 15000

WHERE name = 'Bill';

或者在一个切片上被更新:

UPDATE sal_emp SET pay_by_quarter[1:2] = '{27000,27000}'

WHERE name = 'Carol';

也可以使用省略lower-bound或者 upper-bound的切片语法,但是只能用于 更新一个不是 NULL 或者零维的数组值(否则无法替换现有的下标界线)。

一个已存储的数组值可以被通过为其还不存在的元素赋值来扩大之。任何位于之前已存在的元素和新元素之间的位置都将被空值填充。例如,如果数组myarray目前有4个元素,在用一个更新对myarray[6]赋值后它将有6个元素,其中myarray[5]为空值。目前,采用这种方式扩大数组只允许使用在一维数组上。

带下标的赋值方式允许创建下标不是从1开始的数组。例如,我们可以为myarray[-2:7]赋值来创建一个下标值从-2到7的数组。

新的数组值也可以通过串接操作符||构建:

SELECT ARRAY[1,2] || ARRAY[3,4];

?column?

-----------

{1,2,3,4}

(1 row)

SELECT ARRAY[5,6] || ARRAY[[1,2],[3,4]];

?column?

---------------------

{{5,6},{1,2},{3,4}}

(1 row)

串接操作符允许把一个单独的元素加入到一个一维数组的开头或末尾。它也能接受两个N维数组,或者一个N维数组和一个N+1维数组。

当一个单独的元素被加入到一个一维数组的开头或末尾时,其结果是一个和数组操作数具有相同下界下标的新数组。例如:

SELECT array_dims(1 || '[0:1]={2,3}'::int[]);

array_dims

------------

[0:2]

(1 row)

SELECT array_dims(ARRAY[1,2] || 3);

array_dims

------------

[1:3]

(1 row)

当两个具有相同维度数的数组被串接时,其结果保留左操作数的外维度的下界下标。结果将是一个数组,它由左操作数的每一个元素以及紧接着的右操作数的每一个元素。例如:

SELECT array_dims(ARRAY[1,2] || ARRAY[3,4,5]);

array_dims

------------

[1:5]

(1 row)

SELECT array_dims(ARRAY[[1,2],[3,4]] || ARRAY[[5,6],[7,8],[9,0]]);

array_dims

------------

[1:5][1:2]

(1 row)

当一个N维数组被放在另一个N+1维数组的前面或者后面时,结果和上面的例子相似。每一个N维子数组实际上是N+1维数组外维度的一个元素。例如:

SELECT array_dims(ARRAY[1,2] || ARRAY[[3,4],[5,6]]);

array_dims

------------

[1:3][1:2]

(1 row)

一个数组也可以通过使用函数array_prepend、array_append或array_cat构建。前两个函数仅支持一维数组,但array_cat支持多维数组。 一些例子:

SELECT array_prepend(1, ARRAY[2,3]);

array_prepend

---------------

{1,2,3}

(1 row)

SELECT array_append(ARRAY[1,2], 3);

array_append

--------------

{1,2,3}

(1 row)

SELECT array_cat(ARRAY[1,2], ARRAY[3,4]);

array_cat

-----------

{1,2,3,4}

(1 row)

SELECT array_cat(ARRAY[[1,2],[3,4]], ARRAY[5,6]);

array_cat

---------------------

{{1,2},{3,4},{5,6}}

(1 row)

SELECT array_cat(ARRAY[5,6], ARRAY[[1,2],[3,4]]);

array_cat

---------------------

{{5,6},{1,2},{3,4}}

在简单的情况中,上面讨论的串接操作符比直接使用这些函数更好。不过,由于 串接操作符需要服务于所有三种情况,所以它的负担比较重,在有些情况下使用 这些函数之一有助于避免混淆。例如:

SELECT ARRAY[1, 2] || '{3, 4}'; -- 没有指定类型的文字被当做一个数组

?column?

-----------

{1,2,3,4}

SELECT ARRAY[1, 2] || '7'; -- 这个也是

ERROR: malformed array literal: "7"

SELECT ARRAY[1, 2] || NULL; -- 未修饰的 NULL 也是如此

?column?

----------

{1,2}

(1 row)

SELECT array_append(ARRAY[1, 2], NULL); -- 这可能才是想要的意思

array_append

--------------

{1,2,NULL}

在上面的例子中,解析器看到在串接操作符的一遍看到了一个整数数组,并且在 另一边看到了一个未确定类型的常量。它用来决定该常量类型的启发式规则是假 定它和该操作符的另一个输入具有相同的类型 — 在这种情况中是整数数 组。因此串接操作符表示array_cat而不是 array_append。如果这样做是错误的选择,它可以通过将该常 量造型成数组的元素类型来修复。但是显式地使用array_append 可能是一种最好的方案。

本文地址:http://www.cuug.com.cn/postgresql/jiaocheng/35853132608.html 转载请注明!


在线预约 抢先报名 获取课程排期

Oracle培训机构

金牌讲师<>

冉乃纲-老师CUUG金牌讲师
冉老师 CUUG金牌讲师 Oracle及RedHat高级讲师、Unix/Linux 资深专家...[详细了解老师]

免费咨询上课流程 客服在线中

陈卫星-老师CUUG金牌讲师
陈老师 CUUG金牌讲师 精通Oracle管理、备份恢复、性能优化 11年Ora...[详细了解老师]

免费咨询上课流程 客服在线中

选学校如何选择适合自己的学校

CUUG -CHINA UNIX USER GROUP,是国际UNIX组织UNIFORUM的中国代表,是国内悠久的专业UNIX培训机构,被誉为中国UNIX 的摇篮。多年来,以提高教学质量为本,强调素质教育,积极引进、消化国外的新技术,有效的结合中国....[详情]

一站式服务(从入学到就业一帮到底)

入学

学习

就业

实操

食宿
地址:北京市海淀区田村山南路35号院17号楼
课程咨询:010-59426307 010-59426319 400-0909-964
企业服务:137 1818 8639(陈经理)
部分信息来源于网络,如有错误请联系指正!
版权所有@北京神脑资讯技术有限公司 (CUUG,中国UNIX用户协会) Copyright 2016 ALL Rights Reserved 京ICP备11008061号-1