⌘+k ctrl+k
1.4 (LTS)
搜索快捷键 cmd + k | ctrl + k
数组类型

ARRAY 列用于存储固定大小的数组。列中的所有字段必须具有相同的长度和相同的基础类型。数组通常用于存储数值数组,但也可以包含任何统一的数据类型,包括 ARRAYLISTSTRUCT 类型。

数组可用于存储向量,例如词嵌入 (word embeddings) 或图像嵌入。

若要存储长度可变的列表,请使用 LIST 类型。请参阅数据类型概述以获取嵌套数据类型之间的对比。

PostgreSQL 中的 ARRAY 类型允许变长字段。DuckDB 的 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));

数组可以存储结构体 (structs)

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_extractarray_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 元素
10 1
20 4

使用切片表示法将返回一个 LIST

SELECT id, arr[1:2] AS elements FROM array_table;
id 元素
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 值被认为大于所有其他值,且彼此相等。

另请参阅

有关更多函数,请参阅 列表函数

© 2025 DuckDB 基金会,阿姆斯特丹,荷兰
行为准则 商标使用指南