云数据库 GAUSSDB-数组类型:数组构造器
数组构造器
数组构造器是一个能构建数组值的表达式。简单的数组构造器由关键词ARRAY、“[”、用于数组元素值的表达式列表(用逗号分隔)以及最后的“]”组成。示例如下:
gaussdb=# SELECT ARRAY[1, 2, 3 + 4];
array
---------
{1,2,7}
(1 row)
默认情况下,数组的元素类型是成员表达式的公共类型,使用与UNION或CASE结构(详情请参见UNION,CASE和相关构造)相同的规则决定。可以通过显式类型转换将数组构造为所需的数据类型,示例如下:
gaussdb=# SELECT ARRAY[1, 2, 3]::varchar[]; array --------- {1,2,3} (1 row) gaussdb=# SELECT ARRAY['a', 'b', 'c']; array --------- {a,b,c} (1 row) gaussdb=# SELECT ARRAY['a', 'b', 'c']::int[]; ERROR: invalid input syntax for integer: "a" LINE 1: select ARRAY['a', 'b', 'c']::int[]; ^ CONTEXT: referenced column: array gaussdb=# SELECT ARRAY[1::int, 'b', 'c']; ERROR: invalid input syntax for integer: "b" LINE 1: select ARRAY[1::int, 'b', 'c']; ^ CONTEXT: referenced column: array
除预置的基础类型外,record类型和表类型也可以定义其数组类型,示例:
gaussdb=# CREATE TYPE rec IS (c1 int, c2 int); gaussdb=# SELECT ARRAY[(1, 1), (2, 2)]::rec[]; array ------------------- {"(1,1)","(2,2)"} (1 row) gaussdb=# SELECT ARRAY[rec(1, 1), rec(2, 2)]; array ------------------- {"(1,1)","(2,2)"} (1 row) gaussdb=# CREATE TABLE tab (c1 int, c2 int); gaussdb=# SELECT ARRAY[(1, 1), (2, 2)]::tab[]; array ------------------- {"(1,1)","(2,2)"} (1 row) gaussdb=# DROP TYPE rec; gaussdb=# DROP TABLE tab;
因为数组必须得有类型,因此在构造一个空数组时,必须明确的将其构造成需要的类型,示例:
gaussdb=# SELECT ARRAY[]::int[];
array
-------
{}
(1 row)
也可以从子查询的结果中构造一个数组。此时, 数组构造器是关键字ARRAY后跟着用圆括号括起来的子查询,子查询必须只返回一个单独的字段。生成的一维数组将为子查询里每行结果生成一个元素, 元素类型匹配子查询的输出字段。示例:
gaussdb=# SELECT ARRAY(select generate_series(1, 6));
array
---------------
{1,2,3,4,5,6}
(1 row)
多维数组值可以通过嵌套数组构造器的方法来制作。内层构造器中的ARRAY关键字可以省略。比如,下面两个示例是同样的结果:
gaussdb=# SELECT ARRAY[ARRAY[1,2], ARRAY[3,4]]; array --------------- {{1,2},{3,4}} (1 row) gaussdb=# SELECT ARRAY[[1,2], [3,4]]; array --------------- {{1,2},{3,4}} (1 row)

- 同层的内层构造器必须生成同维的子数组。
- 任何应用于外层ARRAY构造器的类型转换自动的应用到所有的内层构造器。