映射函数
map
从键值对创建一个类型为 Map(key, value) 的值。
语法
参数
返回值
- 一个包含
key:value
对的地图。 Map(key, value)。
示例
查询:
结果:
mapFromArrays
从键的数组或地图及值的数组或地图创建一个映射。
该函数是语法 CAST([...], 'Map(key_type, value_type)')
的一个方便替代方案。
例如,您可以写成 mapFromArrays(['aa', 'bb'], [4, 5])
,而不是写成
CAST((['aa', 'bb'], [4, 5]), 'Map(String, UInt32)')
,或者CAST([('aa',4), ('bb',5)], 'Map(String, UInt32)')
语法
别名: MAP_FROM_ARRAYS(keys, values)
参数
keys
— 用于创建地图的键的数组或地图 Array 或 Map。如果keys
是一个数组,我们接受Array(Nullable(T))
或Array(LowCardinality(Nullable(T)))
作为其类型,只要它不包含 NULL 值。values
- 用于创建地图的值的数组或地图 Array 或 Map。
返回值
- 一个由键数组和值数组/地图构造的地图。
示例
查询:
结果:
mapFromArrays
还接受类型为 Map 的参数。这些参数在执行期间会被转换为元组数组。
结果:
结果:
extractKeyValuePairs
将键值对字符串转换为 Map(String, String)。 解析对噪声(例如日志文件)具有容忍性。 输入字符串中的键值对由一个键、一个键值分隔符和一个值组成。 键值对由一个对分隔符分隔。 键和值可以被引用。
语法
别名:
str_to_map
mapFromString
参数
data
- 要提取键值对的字符串。 String 或 FixedString。key_value_delimiter
- 单字符分隔键和值。默认为:
。 String 或 FixedString。pair_delimiters
- 分隔对的字符集合。默认为,
和;
。 String 或 FixedString。quoting_character
- 用作引用字符的单字符。默认为"
。 String 或 FixedString。
返回值
- 一组键值对。类型: Map(String, String)
示例
查询
结果:
使用单引号 '
作为引用字符:
结果:
不支持转义序列的转义序列:
结果:
要恢复使用 toString
序列化的地图字符串键值对:
结果:
extractKeyValuePairsWithEscaping
与 extractKeyValuePairs
相同,但支持转义。
支持的转义序列: \x
、 \N
、 \a
、 \b
、 \e
、 \f
、 \n
、 \r
、 \t
、 \v
和 \0
。
非标准转义序列将原样返回(包括反斜杠),除非它们是以下之一:
\\
、 '
、 "
、 backtick
、 /
、 =
或 ASCII 控制字符(c <= 31)。
该函数将满足预转义和后转义不合适的用例。例如,考虑以下输入字符串: a: "aaaa\"bbb"
。预期输出为: a: aaaa\"bbbb
。
- 预转义:预转义结果将为:
a: "aaaa"bbb
,然后extractKeyValuePairs
将输出:a: aaaa
- 后转义:
extractKeyValuePairs
将输出a: aaaa\
,后转义将保持不变。
键中的前导转义序列将被跳过,并将被视为无效值。
示例
启用转义序列支持的转义序列:
结果:
mapAdd
收集所有键并对相应的值求和。
语法
参数
参数为 maps 或两个 arrays 的元组,其中第一个数组中的项目表示键,第二个数组包含每个键的值。所有键数组应具有相同的类型,所有值数组应包含可以提升到同一种类型的项目 (Int64、UInt64 或 Float64)。共同提升的类型用作结果数组的类型。
返回值
示例
查询使用 Map
类型:
结果:
使用元组查询:
结果:
mapSubtract
收集所有键并减去相应的值。
语法
参数
参数为 maps 或两个 arrays 的元组,其中第一个数组中的项目表示键,第二个数组包含每个键的值。所有键数组应具有相同的类型,所有值数组应包含可以提升到同一种类型的项目 (Int64、UInt64 或 Float64)。共同提升的类型用作结果数组的类型。
返回值
示例
查询使用 Map
类型:
结果:
查询使用元组地图:
结果:
mapPopulateSeries
用整数键填充地图中缺少的键值对。
为了支持扩展键超出最大值,可以指定一个最大键。
具体来说,该函数返回一个地图,其中键形成从最小键到最大键(或指定的 max
参数)的系列,步长为 1,并有对应值。
如果没有为键指定值,则使用默认值作为值。
在键重复的情况下,仅与键关联出现的第一个值(按出现顺序)。
语法
对于数组参数,keys
和 values
中的元素数量必须对于每一行相同。
参数
参数为 Maps 或两个 Arrays,其中第一个和第二个数组包含每个键的键和值。
映射数组:
map
— 具有整数键的地图。 Map。
或
keys
— 键数组。 Array(Int)。values
— 值数组。 Array(Int)。max
— 最大键值。可选。 Int8, Int16, Int32, Int64, Int128, Int256。
返回值
示例
查询使用 Map
类型:
结果:
使用映射数组查询:
结果:
mapKeys
返回给定地图的键。
该函数可以通过启用设置 optimize_functions_to_subcolumns 来优化。
启用设置后,该函数仅读取 keys 子列,而不是整个地图。
查询 SELECT mapKeys(m) FROM table
被转换为 SELECT m.keys FROM table
。
语法
参数
map
— 地图。 Map。
返回值
- 包含所有键的数组
map
。 Array。
示例
查询:
结果:
mapContains
返回给定键是否包含在给定地图中。
语法
别名: mapContainsKey(map, key)
参数
map
— 地图。 Map。key
— 键。类型必须与map
的键类型匹配。
返回值
- 如果
map
包含key
,则返回1
,否则返回0
。 UInt8。
示例
查询:
结果:
mapContainsKeyLike
语法
参数
map
— 地图。 Map。pattern
- 字符串模式以匹配。
返回值
- 如果
map
包含key
以指定的模式,返回1
,否则返回0
。
示例
查询:
结果:
mapExtractKeyLike
给定一个字符串键的地图和一个 LIKE 模式,该函数返回一个映射,其中元素的键与模式匹配。
语法
参数
map
— 地图。 Map。pattern
- 字符串模式以匹配。
返回值
- 一个包含键匹配指定模式的元素的地图。如果没有元素匹配该模式,则返回一个空地图。
示例
查询:
结果:
mapValues
返回给定地图的值。
该函数可以通过启用设置 optimize_functions_to_subcolumns 来优化。
启用设置后,该函数仅读取 values 子列,而不是整个地图。
查询 SELECT mapValues(m) FROM table
被转换为 SELECT m.values FROM table
。
语法
参数
map
— 地图。 Map。
返回值
- 包含所有
map
的值的数组。 Array。
示例
查询:
结果:
mapContainsValue
返回给定值是否包含在给定地图中。
语法
别名: mapContainsValue(map, value)
参数
map
— 地图。 Map。value
— 值。类型必须与map
的值类型匹配。
返回值
- 如果
map
包含value
,则返回1
,否则返回0
。 UInt8。
示例
查询:
结果:
mapContainsValueLike
语法
参数
map
— 地图。 Map。pattern
- 字符串模式以匹配。
返回值
- 如果
map
包含value
以指定的模式,返回1
,否则返回0
。
示例
查询:
结果:
mapExtractValueLike
给定一个字符串值的地图和一个 LIKE 模式,该函数返回一个映射,其中元素的值与模式匹配。
语法
参数
map
— 地图。 Map。pattern
- 字符串模式以匹配。
返回值
- 一个包含值匹配指定模式的元素的地图。如果没有元素匹配该模式,则返回一个空地图。
示例
查询:
结果:
mapApply
对地图的每个元素应用一个函数。
语法
参数
func
— Lambda function。map
— Map。
返回值
- 返回一个通过对每个元素应用
func(map1[i], ..., mapN[i])
从原始地图获得的地图。
示例
查询:
结果:
mapFilter
通过对每个地图元素应用一个函数来过滤地图。
语法
参数
func
- Lambda function。map
— Map。
返回值
- 返回一个只包含
map
中的元素的地图,对于这些元素func(map1[i], ..., mapN[i])
返回的值不为 0。
示例
查询:
结果:
mapUpdate
语法
参数
返回值
- 返回一个
map1
,其值更新为map2
中相应键的值。
示例
查询:
结果:
mapConcat
基于键的相等性连接多个映射。
如果在多个输入地图中存在具有相同键的元素,则将所有元素添加到结果地图中,但仅能通过运算符 []
访问第一个元素。
语法
参数
maps
– 任意多个 Maps。
返回值
- 返回一个连接所传入的地图的结果地图。
示例
查询:
结果:
查询:
结果:
mapExists([func,], map)
如果 map
中至少存在一个键值对使得 func(key, value)
返回的值不为 0,则返回 1。否则,返回 0。
mapExists
是一个 higher-order function。
您可以将一个 lambda 函数作为第一个参数传递给它。
示例
查询:
结果:
mapAll([func,] map)
如果 func(key, value)
对 map
中的所有键值对返回的值不为 0,则返回 1。否则,返回 0。
请注意,mapAll
是一个 higher-order function。
您可以将一个 lambda 函数作为第一个参数传递给它。
示例
查询:
结果:
mapSort([func,], map)
按升序对地图元素进行排序。
如果指定了 func
函数,则排序顺序由应用于地图的键和值的 func
函数的结果决定。
示例
有关更多详细信息,请参见函数 arraySort 的参考。
mapPartialSort
按升序对地图元素进行排序,并附加 limit
参数,允许进行部分排序。
如果指定了 func
函数,则排序顺序由应用于地图的键和值的 func
函数的结果决定。
语法
参数
func
– 可选,要应用于地图的键和值的函数。 Lambda function。limit
– 排序范围内的元素为 [1..limit]。 (U)Int。map
– 要排序的地图。 Map。
返回值
- 部分排序的地图。 Map。
示例
mapReverseSort([func,], map)
按降序对地图元素进行排序。
如果指定了 func
函数,则排序顺序由应用于地图的键和值的 func
函数的结果决定。
示例
有关更多详细信息,请参见函数 arrayReverseSort。
mapPartialReverseSort
按降序对地图元素进行排序,并附加 limit
参数,允许进行部分排序。
如果指定了 func
函数,则排序顺序由应用于地图的键和值的 func
函数的结果决定。
语法
参数
func
– 可选,要应用于地图的键和值的函数。 Lambda function。limit
– 排序范围内的元素为 [1..limit]。 (U)Int。map
– 要排序的地图。 Map。
返回值
- 部分排序的地图。 Map。
示例