Skip to main content

数组类型

数组是具有相同数据类型(包括数组类型)的零个或多个元素的有序列表。

定义数组

要在 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] 句法,其中 nm 是表示索引的整数,且两者均为包含。可以省略 nm,也可同时省略两者。相对位置从 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