跳到主要内容
跳到主要内容

映射函数

map

从键值对创建一个类型为 Map(key, value) 的值。

语法

参数

  • key_n — 地图条目的键。任何类型都支持作为 Map 的键类型。
  • value_n — 地图条目的值。任何类型都支持作为 Map 的值类型。

返回值

示例

查询:

结果:

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 — 用于创建地图的键的数组或地图 ArrayMap。如果 keys 是一个数组,我们接受 Array(Nullable(T))Array(LowCardinality(Nullable(T))) 作为其类型,只要它不包含 NULL 值。
  • values - 用于创建地图的值的数组或地图 ArrayMap

返回值

  • 一个由键数组和值数组/地图构造的地图。

示例

查询:

结果:

mapFromArrays 还接受类型为 Map 的参数。这些参数在执行期间会被转换为元组数组。

结果:

结果:

extractKeyValuePairs

将键值对字符串转换为 Map(String, String)。 解析对噪声(例如日志文件)具有容忍性。 输入字符串中的键值对由一个键、一个键值分隔符和一个值组成。 键值对由一个对分隔符分隔。 键和值可以被引用。

语法

别名:

  • str_to_map
  • mapFromString

参数

  • data - 要提取键值对的字符串。 StringFixedString
  • key_value_delimiter - 单字符分隔键和值。默认为 :StringFixedString
  • pair_delimiters - 分隔对的字符集合。默认为 ,;StringFixedString
  • quoting_character - 用作引用字符的单字符。默认为 "StringFixedString

返回值

示例

查询

结果:

使用单引号 ' 作为引用字符:

结果:

不支持转义序列的转义序列:

结果:

要恢复使用 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 的元组,其中第一个数组中的项目表示键,第二个数组包含每个键的值。所有键数组应具有相同的类型,所有值数组应包含可以提升到同一种类型的项目 (Int64UInt64Float64)。共同提升的类型用作结果数组的类型。

返回值

  • 根据参数返回一个 maptuple,其中第一个数组包含排序后的键,第二个数组包含值。

示例

查询使用 Map 类型:

结果:

使用元组查询:

结果:

mapSubtract

收集所有键并减去相应的值。

语法

参数

参数为 maps 或两个 arrays 的元组,其中第一个数组中的项目表示键,第二个数组包含每个键的值。所有键数组应具有相同的类型,所有值数组应包含可以提升到同一种类型的项目 (Int64UInt64Float64)。共同提升的类型用作结果数组的类型。

返回值

  • 根据参数返回一个 maptuple,其中第一个数组包含排序后的键,第二个数组包含值。

示例

查询使用 Map 类型:

结果:

查询使用元组地图:

结果:

mapPopulateSeries

用整数键填充地图中缺少的键值对。 为了支持扩展键超出最大值,可以指定一个最大键。 具体来说,该函数返回一个地图,其中键形成从最小键到最大键(或指定的 max 参数)的系列,步长为 1,并有对应值。 如果没有为键指定值,则使用默认值作为值。 在键重复的情况下,仅与键关联出现的第一个值(按出现顺序)。

语法

对于数组参数,keysvalues 中的元素数量必须对于每一行相同。

参数

参数为 Maps 或两个 Arrays,其中第一个和第二个数组包含每个键的键和值。

映射数组:

  • map — 具有整数键的地图。 Map

返回值

  • 根据参数返回一个 Map 或两个 Arrays 的元组:按排序顺序的键,以及对应键的值。

示例

查询使用 Map 类型:

结果:

使用映射数组查询:

结果:

mapKeys

返回给定地图的键。

该函数可以通过启用设置 optimize_functions_to_subcolumns 来优化。 启用设置后,该函数仅读取 keys 子列,而不是整个地图。 查询 SELECT mapKeys(m) FROM table 被转换为 SELECT m.keys FROM table

语法

参数

  • map — 地图。 Map

返回值

  • 包含所有键的数组 mapArray

示例

查询:

结果:

mapContains

返回给定键是否包含在给定地图中。

语法

别名: mapContainsKey(map, key)

参数

  • map — 地图。 Map
  • key — 键。类型必须与 map 的键类型匹配。

返回值

  • 如果 map 包含 key,则返回 1,否则返回 0UInt8

示例

查询:

结果:

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,否则返回 0UInt8

示例

查询:

结果:

mapContainsValueLike

语法

参数

  • map — 地图。 Map
  • pattern - 字符串模式以匹配。

返回值

  • 如果 map 包含 value 以指定的模式,返回 1,否则返回 0

示例

查询:

结果:

mapExtractValueLike

给定一个字符串值的地图和一个 LIKE 模式,该函数返回一个映射,其中元素的值与模式匹配。

语法

参数

  • map — 地图。 Map
  • pattern - 字符串模式以匹配。

返回值

  • 一个包含值匹配指定模式的元素的地图。如果没有元素匹配该模式,则返回一个空地图。

示例

查询:

结果:

mapApply

对地图的每个元素应用一个函数。

语法

参数

返回值

  • 返回一个通过对每个元素应用 func(map1[i], ..., mapN[i]) 从原始地图获得的地图。

示例

查询:

结果:

mapFilter

通过对每个地图元素应用一个函数来过滤地图。

语法

参数

返回值

  • 返回一个只包含 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

示例