Skip to content

Latest commit

 

History

History
168 lines (146 loc) · 5.48 KB

File metadata and controls

168 lines (146 loc) · 5.48 KB
title MAP_CONCAT
language zh-CN

描述

将多个 map 合并为一个 map。当合并具有不同键或值类型的 map 时,该函数会找到键和值的公共类型。

:::info Note 自 Apache Doris 4.0.4 版本起支持。 :::

语法

MAP_CONCAT(<map1> [, <map2> [, <map3> ... ]])

参数

  • <map1>, <map2>, <map3>, ...: MAP 类型,需要合并的输入 map。

支持的键和值类型:

  • 键类型:所有支持比较的基本类型(数值、字符串、日期/时间、布尔值、IP)
  • 值类型:所有基本类型加上复杂类型(ARRAY、MAP、STRUCT)

类型兼容性说明:

  • 当合并具有不同键类型的 map 时,函数会找到公共键类型
  • 当合并具有不同值类型的 map 时,函数会找到公共值类型

返回值

返回一个合并后的 MAP,按参数从左到右合并所有输入 map 中的键值对;若存在重复键,以最后一个 map 的值为准(该键在结果中的位置以最后一次出现为准)。

行为:

  • 结果 map 的键类型是所有输入 map 键类型的公共类型
  • 结果 map 的值类型是所有输入 map 值类型的公共类型
  • 如果类型无法转换(例如,不兼容的键类型),则抛出错误

使用说明

  1. 该函数接受零个或多个 map 参数。
  2. 如果任何参数为 NULL,则结果为 NULL。
  3. 重复键:如果多个 map 包含相同的键,则最后一个 map 的值生效

示例

  1. 基本用法

    select map_concat();
    +--------------+
    | map_concat() |
    +--------------+
    | {}           |
    +--------------+
    
    select map_concat(map('single', 'argument'));
    +---------------------------------------+
    | map_concat(map('single', 'argument')) |
    +---------------------------------------+
    | {"single":"argument"}                 |
    +---------------------------------------+
    
    select map_concat({'a': 'apple'}, {'b': 'banana'}, {'c': 'cherry'});
    +-----------------------------------------------------------+
    | map_concat({'a':'apple'},{'b':'banana'},{'c':'cherry'})   |
    +-----------------------------------------------------------+
    | {"a":"apple", "b":"banana", "c":"cherry"}                 |
    +-----------------------------------------------------------+
    
  2. NULL 参数

    select map_concat({'a': 'apple'}, NULL);
    +---------------------------------+
    | map_concat({'a':'apple'}, NULL) |
    +---------------------------------+
    | NULL                            |
    +---------------------------------+
    

    如果任何参数为 NULL,则结果为 NULL。

  3. 类型转换示例

    -- INT 和 DOUBLE 值类型
    select map_concat({'a': 1, 'b': 2}, {'c': 3.5, 'd': 4.7});
    +----------------------------------------------------+
    | map_concat({'a': 1, 'b': 2}, {'c': 3.5, 'd': 4.7}) |
    +----------------------------------------------------+
    | {"a":1.0, "b":2.0, "c":3.5, "d":4.7}               |
    +----------------------------------------------------+
    

    INT 值被转换为 DOUBLE 以匹配公共类型。

    -- INT 和 VARCHAR 键类型
    select map_concat({1: 'one', 2: 'two'}, {'a': 'apple', 'b': 'banana'});
    +-----------------------------------------------------------------+
    | map_concat({1: 'one', 2: 'two'}, {'a': 'apple', 'b': 'banana'}) |
    +-----------------------------------------------------------------+
    | {"1":"one", "2":"two", "a":"apple", "b":"banana"}               |
    +-----------------------------------------------------------------+
    

    INT 键被转换为 VARCHAR 以匹配公共类型。

    -- INT 和 BIGINT 值类型
    select map_concat({'small': 100}, {'large': 10000000000});
    +----------------------------------------------------+
    | map_concat({'small': 100}, {'large': 10000000000}) |
    +----------------------------------------------------+
    | {"small":100, "large":10000000000}                 |
    +----------------------------------------------------+
    

    INT 值被转换为 BIGINT 以匹配公共类型。

    -- INT 和 VARCHAR 值类型
    select map_concat({'a': 1}, {'b': '2'});
    +----------------------------------+
    | map_concat({'a': 1}, {'b': '2'}) |
    +----------------------------------+
    | {"a":"1", "b":"2"}               |
    +----------------------------------+
    

    INT 值被转换为 VARCHAR 以匹配公共类型。

    -- 包含嵌套数组的复杂类型
    select map_concat({'a':[1,2,3]},{1:['1','2']});
    +-----------------------------------------+
    | map_concat({'a':[1,2,3]},{1:['1','2']}) |
    +-----------------------------------------+
    | {"a":["1", "2", "3"], "1":["1", "2"]}   |
    +-----------------------------------------+
    

    对于复杂类型(如 ARRAY),会递归执行类型转换。

    -- 错误示例:找不到公共类型
    select map_concat({'a':[1,2,3]},{1:3});
    ERROR 1105 (HY000): errCode = 2, detailMessage = mapconcat cannot find the common value type of map_concat(map('a', [1, 2, 3]), map(1, 3))
    

    当找不到公共类型时(例如 ARRAY 和 INT),会抛出错误。