一个LIST
列编码值的列表。列中的字段可以具有不同长度的值,但它们必须都具有相同的基础类型。LIST
通常用于存储数字数组,但可以包含任何统一的数据类型,包括其他LIST
和STRUCT
。
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
类型可以使用所有的比较运算符进行比较。
这些比较可以用于逻辑表达式中,
例如 WHERE
和 HAVING
子句,并返回BOOLEAN
值。
LIST
的顺序是使用以下规则按位置定义的,其中 min_len = min(len(l1), len(l2))
。
- 相等性。
l1
和l2
是相等的,如果对于[1, min_len]
中的每个i
:l1[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。