MAPITEMS
返回关于 VMap 中各项目的信息。使用具有一个或多个可选自变量的转换函数访问 VMap 数据中的聚结构值。该函数需要
over()
子句。
语法
MAPITEMS (VMap-data [, passthrough-arg[,...] ])
参数
-
VMap-data
任何 Vmap 数据。Vmap 的存在形式可以是:
-
Flex 表的
__raw__
列 -
从映射函数返回的数据(示例) MAPLOOKUP
-
其他数据库内容
-
-
max_key_length
- 在
__raw__
列中,确定函数可以返回的键的最大长度。长度超过max_key_length
的键会导致查询失败。默认为 VMap 列长度和 65K 中较小的值。 -
max_value_length
- 在
__raw__
列中,确定函数可以返回的值的最大长度。大于max_value_length
的值会导致查询失败。默认为 VMap 列长度和 65K 中较小的值。 -
passthrough-arg
- 表示
VMap-data
映射数据中键的一个或多个实参。
示例
以下示例说明如何使用带有 over(PARTITION BEST)
子句的 MAPITEMS()
。
此示例使用标记为 darkmountain
的 Flex 表确定映射数据中的虚拟列数。使用 count()
函数查询返回映射数据中的虚拟列数:
=> SELECT COUNT(keys) FROM (SELECT MAPITEMS(darkmountain.__raw__) OVER(PARTITION BEST) FROM
darkmountain) AS a;
count
-------
19
(1 row)
下一个示例确定映射数据中存在哪些项:
=> SELECT * FROM (SELECT MAPITEMS(darkmountain.__raw__) OVER(PARTITION BEST) FROM darkmountain) AS a;
keys | values
-------------+---------------
hike_safety | 50.6
name | Mt Washington
type | mountain
height | 17000
hike_safety | 12.2
name | Denali
type | mountain
height | 29029
hike_safety | 34.1
name | Everest
type | mountain
height | 14000
hike_safety | 22.8
name | Kilimanjaro
type | mountain
height | 29029
hike_safety | 15.4
name | Mt St Helens
type | volcano
(19 rows)
以下示例显示如何将返回值的长度限制为 100000:
=> SELECT LENGTH(keys), LENGTH(values) FROM (SELECT MAPITEMS(__raw__ USING PARAMETERS max_value_length=100000) OVER() FROM t1) x;
LENGTH | LENGTH
--------+--------
9 | 98899
(1 row)
在 VMap 中直接查询关键值
查看以下 JSON 输入文件 simple.json
。特别注意 three_Array
队列及其四个值:
{
"one": "one",
"two": 2,
"three_Array":
[
"three_One",
"three_Two",
3,
"three_Four"
],
"four": 4,
"five_Map":
{
"five_One": 51,
"five_Two": "Fifty-two",
"five_Three": "fifty three",
"five_Four": 54,
"five_Five": "5 x 5"
},
"six": 6
}
-
创建 flex 表,映射:
=> CREATE FLEX TABLE mapper(); CREATE TABLE
将
simple.json
载入 flex 表映射:=> COPY mapper FROM '/home/dbadmin/data/simple.json' parser fjsonparser (flatten_arrays=false, flatten_maps=false); Rows Loaded ------------- 1 (1 row)
在 Flex 表的
__raw__
列上调用 MAPKEYS,查看 Flex 表的键,但不是键子映射。返回值显示three_Array
是虚拟列之一:=> SELECT MAPKEYS(__raw__) OVER() FROM mapper; keys ------------- five_Map four one six three_Array two (6 rows)
在 Flex 表
mapper
上调用mapitems
,将three_Array
作为函数的传递实参。调用返回这些队列值:=> SELECT __identity__, MAPITEMS(three_Array) OVER(PARTITION BY __identity__) FROM mapper; __identity__ | keys | values --------------+------+------------ 1 | 0 | three_One 1 | 1 | three_Two 1 | 2 | 3 1 | 3 | three_Four (4 rows)