param :数组包含的值,允许出现零个或多个,多个值之间用逗号分隔,没有值可填写为NULL。
以'{ param
}' 这种格式作为数组常量时,其中的字符串类型的元素不能再以单引号开始和结束,需要使用双引号。两个连续单引号转换为一个单引号。
以第一个元素的数据类型作为数组的数据类型,要求数组中所有元素的类型相同,或者能够相互转换。
数组类型的定义
一个数组数据类型可以通过在数组元素的数据类型名称后面加上方括号([])来命名。
例如,创建表books,其中表示书本价格的列price的类型为一维integer类型数组,表示书本标签的列tag的类型为二维text类型数组。
INSERT INTO books
VALUES (1, 'One Hundred years of Solitude','{25,25,25,25}','{{"fiction"}, {"adventure"}}'),
(2, 'Robinson Crusoe', '{30,32,32,32}', '{{"adventure"}, {"fiction"}}'),
(3, 'Gone with the Wind', '{27,27,29,28}', '{{"romance"}, {"fantasy"}}');
SELECT * FROM books;
id | title | price_by_quarter | tags
----+-------------------------------+------------------+-------------------------
1 | One Hundred years of Solitude | {25,25,25,25} | {{fiction},{adventure}}
2 | Robinson Crusoe | {30,32,32,32} | {{adventure},{fiction}}
3 | Gone with the Wind | {27,27,29,28} | {{romance},{fantasy}}
(3 rows)
使用ARRAY关键字插入数据:
INSERT INTO books
VALUES (1, 'One Hundred years of Solitude',ARRAY[25,25,25,25],ARRAY['fiction', 'adventure']),
(2, 'Robinson Crusoe', ARRAY[30,32,32,32], ARRAY['adventure', 'fiction']),
(3, 'Gone with the Wind', ARRAY[27,27,29,28], ARRAY['romance', 'fantasy']);
访问数组元素
查询在第二季度价格发生变化的书籍的名称:
SELECT title FROM books WHERE price_by_quarter[1] <> price_by_quarter[2];
title
-----------------
Robinson Crusoe
(1 row)
SELECT tags[2:2] FROM books WHERE title = 'Gone with the Wind';
-----------
{fantasy}
(1 row)
SELECT array_dims(tags) FROM books WHERE title = 'Robinson Crusoe';
array_dims
------------
[1:2]
(1 row)
SELECT array_upper(tags, 1) FROM books WHERE title = 'Robinson Crusoe';
array_upper
-------------
(1 row)
SELECT array_length(tags, 1) FROM books WHERE title = 'Robinson Crusoe';
array_length
--------------
(1 row)
更新整个数组数据:
UPDATE books SET price_by_quarter = '{30,30,30,30}'
WHERE title = 'Robinson Crusoe';
使用ARRAY表达式语法更新整个数组数据:
UPDATE books SET price_by_quarter = ARRAY[30,30,30,30]
WHERE title = 'Robinson Crusoe';
更新数组中的一个元素:
UPDATE books SET price_by_quarter[4] = 35
WHERE title = 'Robinson Crusoe';
更新数组中的一个切片元素:
UPDATE books SET price_by_quarter[1:2] = '{27,27}'
WHERE title = 'Robinson Crusoe';
一个已存储的数组值可以被通过对其还不存在的元素赋值来扩大大小。任何位于已存在的元素和新元素之间的位置都将被空值填充。例如,如果数组myarray目前有4个元素,使用UPDATE对myarray[6]赋值后它将有6个元素,其中myarray[5]为空值。目前,采用这种方式扩大数组只允许使用在一维数组上。
构建新数组
新的数组值也可以通过串接操作符“||”构建。串接操作符允许把一个单独的元素加入到一个一维数组的开头或末尾。也可接受两个N维数组,或者一个N维数组和一个N+1维数组。
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)
使用函数array_prepend、array_append或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}}
(1 row)