MAP
与STRUCT
类似,因为它们都是一个有序的“条目”列表,其中键映射到值。然而,MAP
不需要每一行都有相同的键,因此适用于其他用例。当模式事先未知或每行的模式不同时,MAP
非常有用;它们的灵活性是一个关键的区别点。
MAP
必须为所有键指定单一类型,并为所有值指定单一类型。键和值可以是任何类型,且键的类型不需要与值的类型匹配(例如,一个从 VARCHAR
到 INT
的 MAP
是有效的)。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');
比较运算符
嵌套类型可以使用所有的比较运算符进行比较。
这些比较可以用于逻辑表达式中,
既适用于WHERE
和HAVING
子句,也适用于创建布尔值。
排序是通过位置定义的,就像字典中的单词可以排序一样。
NULL
值比其他所有值都大,并且彼此相等。
在顶层,NULL
嵌套值遵循标准SQL NULL
比较规则:
将NULL
嵌套值与非NULL
嵌套值进行比较会产生NULL
结果。
然而,比较嵌套值的成员时,使用内部嵌套值的NULL
规则,
并且NULL
嵌套值成员将比非NULL
嵌套值成员更高。
Functions
参见 Map Functions。