Map 类型
MAP 与 STRUCT 的相似之处在于,它们都是有序的键值对列表。但 MAP 不要求每一行都具有相同的键,因此适用于预先未知 schema 或每行 schema 不同的场景。
MAP 的所有键必须是同一种类型,所有值也必须是同一种类型。键和值都可以是任意类型,且键的类型不需要与值的类型一致(例如,VARCHAR 到 INT 的 MAP 是合法的)。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'];
[]
比较运算符
嵌套类型可以使用所有比较运算符进行比较。
这些比较可用于逻辑表达式,
适用于 WHERE 和 HAVING 子句,也可用于生成布尔值。
排序按位置定义,方式与词典中的单词排序类似。
NULL 值比较时大于所有其他值,并且彼此视为相等。
在顶层比较中,NULL 嵌套值遵循标准 SQL 的 NULL 比较规则:
将 NULL 嵌套值与非 NULL 嵌套值比较会得到 NULL 结果。
但在比较嵌套值的_成员_时,会使用嵌套值内部的 NULL 规则,
并且 NULL 成员会比较为大于非 NULL 成员。
函数
参见 Map Functions。