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

MAP(映射)与 STRUCT(结构体)相似,它们都是键值对的有序列表。然而,MAP 不需要每一行都具有相同的键,因此适用于预先不知道模式或每一行模式各不相同的使用场景。

MAP 的所有键必须是单一类型,所有值也必须是单一类型。键和值可以是任何类型,且键的类型不需要与值的类型匹配(例如,由 VARCHARINT 组成的 MAP 是有效的)。MAP 不允许包含重复的键。如果找不到某个键,MAP 会返回 NULL,而不会像结构体那样抛出错误。

相比之下,STRUCT 必须具有字符串类型的键,但每个值可以具有不同的类型。有关嵌套数据类型之间的比较,请参见数据类型概述

要构造一个 MAP,请使用前缀为 MAP 关键字的括号语法。

创建映射

一个键为 VARCHAR 类型,值为 INTEGER 类型的映射。此操作返回 {key1=10, key2=20, key3=30}

SELECT MAP {'key1': 10, 'key2': 20, 'key3': 30};

或者使用 map_from_entries 函数。此操作返回 {key1=10, key2=20, key3=30}

SELECT map_from_entries([('key1', 10), ('key2', 20), ('key3', 30)]);

也可以使用两个列表来创建映射:键列表和值列表。此操作返回 {key1=10, key2=20, key3=30}

SELECT MAP(['key1', 'key2', 'key3'], [10, 20, 30]);

映射还可以使用 INTEGER 类型的键和 NUMERIC 类型的值。此操作返回 {1=42.001, 5=-32.100}

SELECT MAP {1: 42.001, 5: -32.1};

键和/或值也可以是嵌套类型。此操作返回 {[a, b]=[1.1, 2.2], [c, d]=[3.3, 4.4]}

SELECT MAP {['a', 'b']: [1.1, 2.2], ['c', 'd']: [3.3, 4.4]};

创建一个包含映射列的表,其键为 INTEGER 类型,值为 DOUBLE 类型

CREATE TABLE tbl (col MAP(INTEGER, DOUBLE));

从映射中检索数据

MAP 的值可以使用 map_extract_value 函数或括号表示法来检索

SELECT MAP {'key1': 5, 'key2': 43}['key1'];
5

如果键的类型错误,则会抛出错误。如果类型正确但映射中不包含该键,则返回 NULL

SELECT MAP {'key1': 5, 'key2': 43}['key3'];
NULL

map_extract 函数(及其同义词 element_at)可用于检索封装在列表中的值;如果映射中不包含该键,则返回一个空列表

SELECT map_extract(MAP {'key1': 5, 'key2': 43}, 'key1');
[5]
SELECT MAP {'key1': 5, 'key2': 43}['key3'];
[]

比较运算符

嵌套类型可以使用所有的比较运算符进行比较。这些比较可用于 WHEREHAVING 子句的逻辑表达式中,以及用于创建布尔值

排序方式与单词在字典中的排序方式相同,按位置定义。NULL 值在比较时大于所有其他值,且彼此视为相等。

在顶层,嵌套的 NULL 值遵循标准 SQL 的 NULL 比较规则:将嵌套的 NULL 值与非 NULL 的嵌套值进行比较会产生 NULL 结果。然而,比较嵌套值的*成员*时,会使用嵌套值内部的 NULL 规则,此时嵌套的 NULL 值成员会被视为大于非 NULL 的嵌套值成员。

函数

参见映射函数

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