⌘+k ctrl+k
1.1.3 (stable)
Search Shortcut cmd + k | ctrl + k
List Type

一个LIST列编码值的列表。列中的字段可以具有不同长度的值,但它们必须都具有相同的基础类型。LIST通常用于存储数字数组,但可以包含任何统一的数据类型,包括其他LISTSTRUCT

LIST 类似于 PostgreSQL 的 ARRAY 类型。DuckDB 使用 LIST 术语,但为了与 PostgreSQL 兼容,提供了一些 array_ 函数

请参阅数据类型概述以比较嵌套数据类型。

为了存储固定长度的列表,DuckDB使用了ARRAY类型

创建列表

可以使用list_value(expr, ...)函数或等效的括号表示法[expr, ...]来创建列表。表达式可以是常量或任意表达式。要从表列创建列表,请使用list聚合函数。

整数列表:

SELECT [1, 2, 3];

带有NULL值的字符串列表:

SELECT ['duck', 'goose', NULL, 'heron'];

包含NULL值的列表列表:

SELECT [['duck', 'goose', 'heron'], NULL, ['frog', 'toad'], []];

使用 list_value 函数创建一个列表:

SELECT list_value(1, 2, 3);

创建一个包含INTEGER列表列和VARCHAR列表列的表:

CREATE TABLE list_table (int_list INTEGER[], varchar_list VARCHAR[]);

从列表中检索

从列表中检索一个或多个值可以通过使用括号和切片符号来完成,或者通过列表函数list_extract。提供了多个等效函数作为别名,以便与将列表称为数组的系统兼容。例如,函数array_slice

我们将列表创建包裹在括号中,以便它首先发生。 这仅在我们这里的基本示例中需要,而不是在处理列表列时。 例如,这不能被解析:SELECT ['a', 'b', 'c'][1]

示例 结果
SELECT (['a', 'b', 'c'])[3] 'c'
选择 (['a', 'b', 'c'])[-1] 'c'
选择 (['a', 'b', 'c'])[2 + 1] 'c'
SELECT list_extract(['a', 'b', 'c'], 3) 'c'
SELECT (['a', 'b', 'c'])[1:2] ['a', 'b']
选择 (['a', 'b', 'c'])[:2] ['a', 'b']
选择 (['a', 'b', 'c'])[-2:] ['b', 'c']
SELECT list_slice(['a', 'b', 'c'], 2, 3) ['b', 'c']

比较和排序

LIST 类型可以使用所有的比较运算符进行比较。 这些比较可以用于逻辑表达式中, 例如 WHEREHAVING 子句,并返回BOOLEAN

LIST 的顺序是使用以下规则按位置定义的,其中 min_len = min(len(l1), len(l2))

  • 相等性。 l1l2 是相等的,如果对于 [1, min_len] 中的每个 il1[i] = l2[i]
  • 小于. 对于第一个索引 i[1, min_len] 中,其中 l1[i] != l2[i]: 如果 l1[i] < l2[i], l1 小于 l2.

NULL 值按照 PostgreSQL 的语义进行比较。较低的嵌套级别用于打破平局。

以下是一些返回true的比较查询。

SELECT [1, 2] < [1, 3] AS result;
SELECT [[1], [2, 4, 5]] < [[2]] AS result;
SELECT [ ] < [1] AS result;

这些查询返回 false

SELECT [ ] < [ ] AS result;
SELECT [1, 2] < [1] AS result;

这些查询返回 NULL

SELECT [1, 2] < [1, NULL, 4] AS result;

更新列表

列表的更新在内部表示为插入和删除操作。 因此,更新列表值可能会导致主键/唯一键上的重复键错误。 请参见以下示例:

CREATE TABLE tbl (id INTEGER PRIMARY KEY, lst INTEGER[], comment VARCHAR);
INSERT INTO tbl VALUES (1, [12, 34], 'asd');
UPDATE tbl SET lst = [56, 78] WHERE id = 1;
Constraint Error: Duplicate key "id: 1" violates primary key constraint.
If this is an unexpected constraint violation please double check with the known index limitations section in our documentation (https://duckdb.org/docs/sql/indexes).

Functions

参见 List Functions