Array 类型
ARRAY 列用于存储固定大小的数组。列中的所有字段必须具有相同长度和相同的底层类型。数组通常用于存储数字数组,但也可以包含任何统一的数据类型,包括 ARRAY、LIST 和 STRUCT 类型。
数组可用于存储向量,例如词嵌入或图像嵌入。
要存储可变长度列表,请使用 LIST 类型。有关嵌套数据类型之间的比较,请参阅数据类型概览。
PostgreSQL 中的
ARRAY类型允许可变长度字段。Goose 的ARRAY类型是固定长度的。
创建数组
可以使用 array_value(expr, ...) 函数创建数组。
使用 array_value 函数构造:
SELECT array_value(1, 2, 3);
你始终可以将数组隐式转换为列表(并使用列表函数,例如 list_extract、[i]):
SELECT array_value(1, 2, 3)[2];
你可以将列表转换为数组(维度必须匹配):
SELECT [3, 2, 1]::INTEGER[3];
数组可以嵌套:
SELECT array_value(array_value(1, 2), array_value(3, 4), array_value(5, 6));
数组可以存储 struct:
SELECT array_value({'a': 1, 'b': 2}, {'a': 3, 'b': 4});
定义数组字段
可以使用 ⟨TYPE_NAME⟩[⟨LENGTH⟩] 语法创建数组。例如,要创建一个包含 3 个整数的数组字段,请执行:
CREATE TABLE array_table (id INTEGER, arr INTEGER[3]);
INSERT INTO array_table VALUES (10, [1, 2, 3]), (20, [4, 5, 6]);
从数组中检索值
可使用方括号和切片语法,或通过 list_extract 与 array_extract 等列表函数从数组中检索一个或多个值。以下示例使用定义数组字段中的表。
以下用于提取数组第一个元素的查询是等价的:
SELECT id, arr[1] AS element FROM array_table;
SELECT id, list_extract(arr, 1) AS element FROM array_table;
SELECT id, array_extract(arr, 1) AS element FROM array_table;
| id | element |
|---|---|
| 10 | 1 |
| 20 | 4 |
使用切片语法会返回一个 LIST:
SELECT id, arr[1:2] AS elements FROM array_table;
| id | elements |
|---|---|
| 10 | [1, 2] |
| 20 | [4, 5] |
函数
所有 LIST 函数都可用于 ARRAY 类型。此外,还支持多个 ARRAY 原生函数。
请参阅 ARRAY 函数。
示例
创建示例数据:
CREATE TABLE x (i INTEGER, v FLOAT[3]);
CREATE TABLE y (i INTEGER, v FLOAT[3]);
INSERT INTO x VALUES (1, array_value(1.0::FLOAT, 2.0::FLOAT, 3.0::FLOAT));
INSERT INTO y VALUES (1, array_value(2.0::FLOAT, 3.0::FLOAT, 4.0::FLOAT));
计算叉积:
SELECT array_cross_product(x.v, y.v)
FROM x, y
WHERE x.i = y.i;
计算余弦相似度:
SELECT array_cosine_similarity(x.v, y.v)
FROM x, y
WHERE x.i = y.i;
排序
ARRAY 实例的排序按字典序定义。NULL 值大于所有其他值,且彼此视为相等。
另请参阅
更多函数请参阅List 函数。