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

MAP 类型与 STRUCT 类型相似,都是键到值的有序“条目”列表。然而,MAP 类型不需要每行都包含相同的键,因此适用于其他用例。当模式事先未知或模式每行不同时,MAP 类型非常有用;其灵活性是关键的区别所在。

MAP 类型的所有键必须具有单一类型,所有值也必须具有单一类型。键和值可以是任何类型,并且键的类型无需与值的类型匹配(例如,`VARCHAR` 到 `INT` 的 MAP 是有效的)。MAP 类型不允许有重复的键。如果找不到键,MAP 类型会返回 NULL,而不会像结构体 (structs) 那样抛出错误。

相比之下,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 中选择会返回一个 LIST 而非单个值,空的 LIST 意味着未找到键。

使用方括号表示法检索键位置处的值。请注意,方括号表示法中的表达式必须与映射键的类型匹配

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

如果元素不在映射中,将返回 NULL 值。

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

`element_at` 函数可用于将映射值检索为列表

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

比较运算符

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

排序是按位置定义的,与单词在字典中的排序方式相同。NULL 值与所有其他值比较时都更大,并且相互之间被认为是相等的。

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

函数

请参阅映射函数