结构体与 Map 函数
本页收录 struct 与 map 函数,用于构造 struct 和 map 值,以及从中提取字段、键和值。
| 函数 | 别名 | 说明 |
|---|---|---|
named_struct |
— | 用指定的名称与表达式对构造 struct |
struct |
row | 用输入表达式构造 struct,字段可选命名 |
get_field |
— | 按给定 key 返回 map 或 struct 中的字段 |
map |
— | 用指定键值对构造 map(make_map 为其变体) |
map_extract |
element_at | 返回 map 中给定 key 对应值组成的列表 |
map_keys |
— | 返回 map 中所有 key 组成的列表 |
map_values |
— | 返回 map 中所有 value 组成的列表 |
named_struct
使用指定的名称与输入表达式对,返回一个 struct。
语法:named_struct(expression1_name, expression1_input[, ..., expression_n_name, expression_n_input])
参数:
- expression_n_name:列字段的名称。必须是常量字符串。
- expression_n_input:要包含在输出 struct 中的表达式。可以是常量、列或函数,以及任意算术或字符串运算符的组合。
示例:
例如,下面的查询将 a、b 两列转换为单个 struct 类型的列,字段为 field_a 和 field_b:
1> select * from t;
2+---+---+
3| a | b |
4+---+---+
5| 1 | 2 |
6| 3 | 4 |
7+---+---+
8> select named_struct('field_a', a, 'field_b', b) from t;
9+-------------------------------------------------------+
10| named_struct(Utf8("field_a"),t.a,Utf8("field_b"),t.b) |
11+-------------------------------------------------------+
12| {field_a: 1, field_b: 2} |
13| {field_a: 3, field_b: 4} |
14+-------------------------------------------------------+
struct
使用指定的输入表达式返回一个 struct,输入表达式可选命名。返回的 struct 中,字段使用可选指定的名称或 cN 命名约定,例如 c0、c1、c2 等。
语法:struct(expression1[, ..., expression_n])
参数:
- expression1, expression_n:要包含在输出 struct 中的表达式。可以是常量、列或函数,以及任意算术或字符串运算符的组合。
别名:row
示例:
例如,下面的两个查询将 a、b 两列转换为单个 struct 类型的列:第一个查询使用默认名称 c0、c1;第二个查询把第一个字段命名为 field_a,第二个字段仍用默认名 c1:
1> select * from t;
2+---+---+
3| a | b |
4+---+---+
5| 1 | 2 |
6| 3 | 4 |
7+---+---+
8
9-- use default names `c0`, `c1`
10> select struct(a, b) from t;
11+-----------------+
12| struct(t.a,t.b) |
13+-----------------+
14| {c0: 1, c1: 2} |
15| {c0: 3, c1: 4} |
16+-----------------+
17
18-- name the first field `field_a`
19> select struct(a as field_a, b) from t;
20+--------------------------------------------------+
21| named_struct(Utf8("field_a"),t.a,Utf8("c1"),t.b) |
22+--------------------------------------------------+
23| {field_a: 1, c1: 2} |
24| {field_a: 3, c1: 4} |
25+--------------------------------------------------+
get_field
按给定 key 返回 map 或 struct 中的字段。注意:大多数用户通过字段访问语法间接调用 get_field,例如 my_struct_col['field_name'] 会转换为 get_field(my_struct_col, 'field_name') 调用。
语法:get_field(expression1, expression2)
参数:
- expression1:要取字段的 map 或 struct。
- expression2:要读取的 map 或 struct 中的字段名。求值结果必须为字符串。
示例:
1> select get_field(named_struct('c0', 1, 'c1', 'a'), 'c0');
2+------------------------------------------------------------+
3| named_struct(Utf8("c0"),Int64(1),Utf8("c1"),Utf8("a"))[c0] |
4+------------------------------------------------------------+
5| 1 |
6+------------------------------------------------------------+
7> select get_field(named_struct('c0', 1, 'c1', 'a'), 'c1');
8+------------------------------------------------------------+
9| named_struct(Utf8("c0"),Int64(1),Utf8("c1"),Utf8("a"))[c1] |
10+------------------------------------------------------------+
11| a |
12+------------------------------------------------------------+
map
返回包含指定键值对的 map。map 接收一个键列表和一个值列表,两者按位置一一配对;也可使用 map { key: value[, ...] } 字面量语法。每个键必须唯一且非空。
make_map 是 map 的变体,接收交替排列的键、值标量参数(key1, value1, key2, value2, ...),返回等价的 map。
语法:map(key_list, value_list)
也可写作:map { key: value[, ...] }、make_map(key1, value1[, key2, value2, ...])
参数:
- key_list:用作键的列表,每个键必须唯一且非空。可以是常量、列、函数,或任意运算符的组合。
- value_list:与键列表按位置一一对应的值列表。
示例:
1> select map(['type'], ['test']);
2+--------------------------------------------------------+
3| map(make_array(Utf8("type")),make_array(Utf8("test"))) |
4+--------------------------------------------------------+
5| {type: test} |
6+--------------------------------------------------------+
7> select map(['POST', 'HEAD', 'PATCH'], [41, 33, null]);
8+-----------------------------------------------------------------------------------------------+
9| map(make_array(Utf8("POST"),Utf8("HEAD"),Utf8("PATCH")),make_array(Int64(41),Int64(33),NULL)) |
10+-----------------------------------------------------------------------------------------------+
11| {POST: 41, HEAD: 33, PATCH: } |
12+-----------------------------------------------------------------------------------------------+
13> select map([[1,2], [3,4]], ['a', 'b']);
14+--------------------------------------------------------------------------------------------------------------+
15| map(make_array(make_array(Int64(1),Int64(2)),make_array(Int64(3),Int64(4))),make_array(Utf8("a"),Utf8("b"))) |
16+--------------------------------------------------------------------------------------------------------------+
17| {[1, 2]: a, [3, 4]: b} |
18+--------------------------------------------------------------------------------------------------------------+
19> select map { 'a': 1, 'b': 2 };
20+--------------------------------------------------------------------+
21| map(make_array(Utf8("a"),Utf8("b")),make_array(Int64(1),Int64(2))) |
22+--------------------------------------------------------------------+
23| {a: 1, b: 2} |
24+--------------------------------------------------------------------+
25> select make_map('POST', 41, 'HEAD', 33);
26+----------------------------------------------------------------------------+
27| map(make_array(Utf8("POST"),Utf8("HEAD")),make_array(Int64(41),Int64(33))) |
28+----------------------------------------------------------------------------+
29| {POST: 41, HEAD: 33} |
30+----------------------------------------------------------------------------+
31> select make_map('key1', 'value1', 'key2', null);
32+----------------------------------------------------------------------------+
33| map(make_array(Utf8("key1"),Utf8("key2")),make_array(Utf8("value1"),NULL)) |
34+----------------------------------------------------------------------------+
35| {key1: value1, key2: } |
36+----------------------------------------------------------------------------+
map_extract
返回一个列表,包含给定 key 对应的值。当 key 不在 map 中,或 key 存在但对应值为 NULL 时,均返回空列表;这两种情况通过 map_extract 无法区分,如需判断 key 是否存在,可改用 map_keys。
语法:map_extract(map, key)
参数:
- map:Map 表达式。可以是常量、列或函数,以及任意 map 运算符的组合。
- key:要从 map 中提取的 key。可以是常量、列或函数,任意算术或字符串运算符的组合,或由前述内容构成的命名表达式。
别名:element_at
示例:
1> select map_extract(map {'a': 1, 'b': NULL, 'c': 3}, 'a');
2+----------------------------------------------------------------------------------------------------------+
3| map_extract(map(make_array(Utf8("a"),Utf8("b"),Utf8("c")),make_array(Int64(1),NULL,Int64(3))),Utf8("a")) |
4+----------------------------------------------------------------------------------------------------------+
5| [1] |
6+----------------------------------------------------------------------------------------------------------+
7> select map_extract(map {1: 'one', 2: 'two'}, 2);
8+----------------------------------------------------------------------------------------------+
9| map_extract(map(make_array(Int64(1),Int64(2)),make_array(Utf8("one"),Utf8("two"))),Int64(2)) |
10+----------------------------------------------------------------------------------------------+
11| [two] |
12+----------------------------------------------------------------------------------------------+
13> select map_extract(map {'x': 10, 'y': NULL, 'z': 30}, 'y');
14+------------------------------------------------------------------------------------------------------------+
15| map_extract(map(make_array(Utf8("x"),Utf8("y"),Utf8("z")),make_array(Int64(10),NULL,Int64(30))),Utf8("y")) |
16+------------------------------------------------------------------------------------------------------------+
17| [] |
18+------------------------------------------------------------------------------------------------------------+
19> select map_extract(map {'x': 10, 'y': NULL, 'z': 30}, 'w');
20+------------------------------------------------------------------------------------------------------------+
21| map_extract(map(make_array(Utf8("x"),Utf8("y"),Utf8("z")),make_array(Int64(10),NULL,Int64(30))),Utf8("w")) |
22+------------------------------------------------------------------------------------------------------------+
23| [] |
24+------------------------------------------------------------------------------------------------------------+
上面后两个查询用的是同一个 map:'y' 在 map 内但对应值为 NULL,'w' 根本不在 map 内,两者都返回空列表 [],无法区分。
map_keys
返回 map 中所有 key 组成的列表。
语法:map_keys(map)
参数:
- map:Map 表达式。可以是常量、列或函数,以及任意 map 运算符的组合。
示例:
1> select map_keys(map {'a': 1, 'b': NULL, 'c': 3});
2+---------------------------------------------------------------------------------------------+
3| map_keys(map(make_array(Utf8("a"),Utf8("b"),Utf8("c")),make_array(Int64(1),NULL,Int64(3)))) |
4+---------------------------------------------------------------------------------------------+
5| [a, b, c] |
6+---------------------------------------------------------------------------------------------+
7> select map_keys(map([100, 5], [42, 43]));
8+--------------------------------------------------------------------------------+
9| map_keys(map(make_array(Int64(100),Int64(5)),make_array(Int64(42),Int64(43)))) |
10+--------------------------------------------------------------------------------+
11| [100, 5] |
12+--------------------------------------------------------------------------------+
map_values
返回 map 中所有 value 组成的列表。
语法:map_values(map)
参数:
- map:Map 表达式。可以是常量、列或函数,以及任意 map 运算符的组合。
示例:
1> select map_values(map {'a': 1, 'b': NULL, 'c': 3});
2+-----------------------------------------------------------------------------------------------+
3| map_values(map(make_array(Utf8("a"),Utf8("b"),Utf8("c")),make_array(Int64(1),NULL,Int64(3)))) |
4+-----------------------------------------------------------------------------------------------+
5| [1, , 3] |
6+-----------------------------------------------------------------------------------------------+
7> select map_values(map([100, 5], [42, 43]));
8+----------------------------------------------------------------------------------+
9| map_values(map(make_array(Int64(100),Int64(5)),make_array(Int64(42),Int64(43)))) |
10+----------------------------------------------------------------------------------+
11| [42, 43] |
12+----------------------------------------------------------------------------------+
评价此篇文章
