⌘+k ctrl+k
1.3 (稳定版)
搜索快捷键 cmd + k | ctrl + k
列表类型

一个 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'][3] 'c'
SELECT ['a', 'b', 'c'][-1] 'c'
SELECT ['a', 'b', 'c'][2 + 1] 'c'
SELECT list_extract(['a', 'b', 'c'], 3) 'c'
SELECT ['a', 'b', 'c'][1:2] ['a', 'b']
SELECT ['a', 'b', 'c'][:2] ['a', 'b']
SELECT ['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))

  • 相等性。 如果对于 [1, min_len] 中的每个 i,都有 l1[i] = l2[i],则 l1l2 相等。
  • 小于。 对于 [1, min_len] 中第一个 l1[i] != l2[i] 的索引 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;

函数

请参阅列表函数