数组类型
数组是具有相同数据类型(包括数组类型)的零个或多个元素的有序列表。
定义数组
要在 schema 中定义数组,可在定义 schema 时在列的数据类型后添加 []
。例如,可以使用 trip_id VARCHAR[]
创建一个存储行程 ID 的数组。
也可以在 SQL 语句中使用此句法定义临时数组:
Array[value1, value2, ...]
示例
以下语句可定义一个临时数组并检索其中的列。
SELECT ARRAY['foo', 'bar', null];
-----返回结果
{foo,bar,NULL}
以下语句可定义一个包含数组(该数组中也包含数组)的表 x
。
CREATE TABLE x (a INT[][]);
以下语句可定义一个包含数组 trip_id
的表 taxi
。
CREATE TABLE taxi (
taxi_id VARCHAR,
trip_id VARCHAR[],
plate VARCHAR,
company VARCHAR,
license_expiration_date DATE,
licensed_to VARCHAR
);
将值添加到数组
要向数组中添加值,可在 SQL 语句中使用 ARRAY 表示这是一个数组,然后用 []
封装数组中的数据。例如,ARRAY ['ABCD1234', 'ABCD1235', 'ABCD1236', 'ABCD1237']
。
示例
向表 x
添加值:
INSERT INTO x VALUES (Array[Array[1], Array[2,3]]);
向表 taxi
添加值:
INSERT INTO taxi VALUES
(
'FAST0001',
ARRAY['ABCD1234', 'ABCD1235', 'ABCD1236', 'ABCD1237'],
'N5432N',
'FAST TAXI',
'2030-12-31',
'DAVID WANG'
);
检索数组中的数据
要检索数组中的数据,可使用 ARRAY_COLUMN[RELATIVE_POSITION]
句法。相对位置从 1 开始。例如,要访问 trip_id
数组中的第一个对象 ABCD1234
,可以指定 trip_id[1]
。
示例
从表 x
中检索数组 a
中的第二个元素。
SELECT a[2] FROM x;
-----返回结果
{2,3}
从表 taxi
中检索数组 trip_id
中的第一个元素。
SELECT trip_id[1]
FROM taxi;
-----返回结果
'ABCD1234'
检索数组的切片
要检索数组中的数据,可使用 ARRAY_COLUMN[n:m]
句法,其中 n
和 m
是表示索引的整数,且两者均为包含。可以省略 n
或 m
,也可同时省略两者。相对位置从 1 开始。在多维数组中,可以使用维数不匹配的数组。
示例
省略 n
可检索整个数组。
SELECT array[1,NULL,2][:3];
----返回结果
{1,NULL,2}
从多维数组中检索前两个元素。
SELECT array[array[1],array[2],array[3]][-21432315:134124523][1:2];
----
{{1},{2}}
与 PostgreSQL 的不同之处
在 RisingWave 中,假设 arr
的类型是 T[ ][ ][ ]:
- arr[x] 的类型是 T[ ][ ]
- arr[x][y] 被解释为 arr[x],类型是 T[ ]
- arr[x0:x1] 的类型是 T[ ][ ][ ]
- arr[x0:x1][y0:y1] 被解释为 arr[x0:x1],类型是 T[ ][ ][ ]
- arr[x0:x1][y] 被解释为 arr[x0:x1],类型是 type T[ ][ ]
在 PostgreSQL 中,三维数组 arr
仍然是类型 T[ ]:
- arr[x] 或 arr[x][y] 的类型是 T,但由于索引数量不足,其值为
NULL
- arr[x][y][z] 的类型是 T
- arr[x0:x1][y0:y1][z0:z1] 的类型是 T[ ],且为三维
- arr[x0:x1] 被解释为 arr[x0:x1][:][:],类型是 T[ ],且为三维
- arr[x0:x1][y] 被解释为 arr[x0:x1][1:y][:],类型是 T[ ],且为三维
从数组中展开数据
可使用 unnest()
函数将数组中的值展开到单独的行中。
SELECT unnest(array[1,2,3,4]);
------返回结果
1
2
3
4