跳到主要内容

Map 类型

MAPSTRUCT 的相似之处在于,它们都是有序的键值对列表。但 MAP 不要求每一行都具有相同的键,因此适用于预先未知 schema 或每行 schema 不同的场景。

MAP 的所有键必须是同一种类型,所有值也必须是同一种类型。键和值都可以是任意类型,且键的类型不需要与值的类型一致(例如,VARCHARINTMAP 是合法的)。MAP 不允许重复键。与 STRUCT 在缺失字段时抛错不同,MAP 在找不到键时返回 NULL

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

要构造 MAP,请使用 MAP 关键字加花括号语法。

创建 Map

一个键为 VARCHAR、值为 INTEGER 的 map。返回 {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)]);

Map 也可以通过两个列表(键列表和值列表)创建。返回 {key1=10, key2=20, key3=30}

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

Map 也可以使用 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]};

创建一个包含 map 列的表,该列键为 INTEGER、值为 DOUBLE

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

从 Map 取值

可通过 map_extract_value 函数或方括号语法获取 MAP 中的值:

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

如果键类型不正确,会抛出错误;如果键类型正确但 map 中不存在该键,则返回 NULL

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

map_extract 函数(以及其同义词 element_at)可用于获取被列表包装的值;若 map 中不包含该键,则返回空列表:

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 成员。

函数

参见 Map Functions