⌘+k ctrl+k
1.1.3 (stable)
Search Shortcut cmd + k | ctrl + k
Map Type

MAPSTRUCT类似,因为它们都是一个有序的“条目”列表,其中键映射到值。然而,MAP不需要每一行都有相同的键,因此适用于其他用例。当模式事先未知或每行的模式不同时,MAP非常有用;它们的灵活性是一个关键的区别点。

MAP 必须为所有键指定单一类型,并为所有值指定单一类型。键和值可以是任何类型,且键的类型不需要与值的类型匹配(例如,一个从 VARCHARINTMAP 是有效的)。MAP 不能有重复的键。如果未找到键,MAP 会返回一个空列表,而不是像结构体那样抛出错误。

相比之下,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则表示未找到该键。

使用方括号表示法来检索包含键位置值的列表。这将返回[5]。请注意,方括号表示法中的表达式必须与映射键的类型匹配:

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

要检索基础值,请使用列表选择语法获取第一个元素。这将返回 5

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

如果元素不在映射中,将返回一个空列表。这将返回[]。请注意,括号表示法中的表达式必须与映射键的类型匹配,否则将返回错误:

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

element_at 函数也可以用于检索映射值。这将返回 [5]

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

比较运算符

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

排序是通过位置定义的,就像字典中的单词可以排序一样。 NULL 值比其他所有值都大,并且彼此相等。

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

Functions

参见 Map Functions