在 Doris 中GROUP_CONCAT是常用的聚合函数用于将分组内某列的多个值拼接成一个字符串。它支持通过ORDER BY对拼接的元素排序通过SEPARATOR指定元素间的分隔符默认分隔符为英文逗号,。以下从基础语法、核心用法含排序 自定义分隔符、注意事项、常见场景四个维度进行总结确保覆盖实际开发中的高频需求。一、基础语法Doris 中GROUP_CONCAT的完整语法格式如下兼容 MySQL 语法降低学习成本sqlGROUP_CONCAT( [DISTINCT] -- 可选去重后再拼接 列名/表达式 -- 必选需拼接的列或计算表达式如 IF、CASE 结果 [ORDER BY 排序列 [ASC/DESC]] -- 可选对拼接的元素排序 [SEPARATOR 分隔符] -- 可选指定元素间的分隔符默认是 , )关键参数说明参数作用是否必选列名/表达式指定分组内需要拼接的数据来源如某列值、或IF(status1, 正常, 异常)这类计算结果是DISTINCT可选对拼接的元素去重例如同一分组内有重复值只保留一个否ORDER BY 排序列可选对分组内待拼接的元素按指定列排序确保拼接结果的顺序可预期否SEPARATOR 分隔符可选指定元素间的分隔符如 、-、空字符串等默认是,否二、核心用法总结含示例以下示例基于一张模拟的user_orders表数据如下覆盖GROUP_CONCAT与ORDER BY、SEPARATOR的组合用法user_idorder_idorder_dateproduct_nameamount10150012024-05-01手机399910150032024-05-03耳机29910150022024-05-02充电器8910250042024-05-01键盘19910250052024-05-02鼠标991. 基础用法默认分隔符无排序不指定ORDER BY和SEPARATOR默认按数据存储顺序拼接分隔符为,。需求按user_id分组拼接每个用户的订单 ID。sqlSELECT user_id, GROUP_CONCAT(order_id) AS order_id_list -- 默认用 , 拼接无排序 FROM user_orders GROUP BY user_id;结果注意101 的订单 ID 顺序未排序与存储顺序一致user_idorder_id_list1015001,5003,50021025004,50052. 结合ORDER BY按指定字段排序后拼接实际场景中常需要按时间、数值等排序后拼接如按订单日期升序确保结果顺序可预期。需求按user_id分组按order_date升序拼接每个用户的 “订单 ID - 商品名”。sqlSELECT user_id, -- 拼接格式order_id-product_name按 order_date 升序排序 GROUP_CONCAT( CONCAT(order_id, -, product_name) -- 自定义拼接元素格式 ORDER BY order_date ASC -- 按订单日期升序 ) AS order_product_list FROM user_orders GROUP BY user_id;结果101 的订单按日期从早到晚排序5001→5002→5003user_idorder_product_list1015001 - 手机5002 - 充电器5003 - 耳机1025004 - 键盘5005 - 鼠标3. 结合SEPARATOR自定义分隔符默认分隔符是,可通过SEPARATOR指定其他分隔符如|、-、空字符串等。需求按user_id分组用|分隔符拼接商品名且按金额降序排序。sqlSELECT user_id, GROUP_CONCAT( product_name ORDER BY amount DESC -- 按订单金额降序手机耳机充电器 SEPARATOR | -- 自定义分隔符为 | ) AS product_list_by_amount FROM user_orders GROUP BY user_id;结果101 的商品按金额从高到低排序分隔符为|user_idproduct_list_by_amount101手机耳机充电器102键盘鼠标4. 含DISTINCT去重后拼接若分组内某列有重复值如同一用户多次购买同一商品可通过DISTINCT去重后再拼接。需求按user_id分组去重后拼接用户购买的商品类别假设新增category列存在重复。sql-- 模拟表新增 category 列后的数据101重复购买“数码”类商品 SELECT user_id, GROUP_CONCAT( DISTINCT category -- 去重同一类别只保留一次 ORDER BY category ASC SEPARATOR - ) AS distinct_category FROM user_orders GROUP BY user_id;结果101 的 “数码” 类别去重后只出现一次user_iddistinct_category101数码 - 配件102外设5. 空字符串分隔符无缝拼接若需要拼接后无分隔符如将数值拼接成一串数字可指定SEPARATOR 空字符串。需求按user_id分组将订单金额按日期升序无缝拼接如 399929989。sqlSELECT user_id, GROUP_CONCAT( amount ORDER BY order_date ASC SEPARATOR -- 空分隔符无缝拼接 ) AS amount_concat FROM user_orders GROUP BY user_id;结果101 的金额按日期拼接为 39995.1895.22995.3 399989299user_idamount_concat10139998929910219999三、注意事项避坑指南必须搭配GROUP BYGROUP_CONCAT是聚合函数不能单独使用必须配合GROUP BY指定分组字段除非仅聚合全表数据此时GROUP BY可省略但不推荐可读性差。❌ 错误示例无GROUP BY全表聚合仅返回 1 行sqlSELECT GROUP_CONCAT(product_name); -- 不推荐需明确分组逻辑✅ 正确示例按user_id分组sqlSELECT user_id, GROUP_CONCAT(product_name) FROM user_orders GROUP BY user_id;排序字段需在分组上下文内ORDER BY后指定的 “排序列”必须是分组字段、聚合列、或原始表中存在的列不能是其他未关联的列。❌ 错误示例排序列other_col不在表中sqlSELECT user_id, GROUP_CONCAT(product_name ORDER BY other_col) FROM user_orders GROUP BY user_id;结果长度限制默认 1024 字符Doris 中GROUP_CONCAT的默认结果长度限制为1024 个字符若拼接后字符串超长会被截断导致数据丢失。查看当前限制执行SHOW VARIABLES LIKE group_concat_max_len;临时调整限制会话级执行SET group_concat_max_len 102400;设置为 100KB根据需求调整永久调整需在 Doris 配置文件中修改group_concat_max_len参数需重启服务。NULL 值处理若待拼接的列包含NULLGROUP_CONCAT会自动忽略NULL值不拼接NULL也不会用分隔符填充。示例若某用户的product_name有NULL拼接结果会跳过该值sql-- 假设 user_id101 有一条 product_nameNULL 的数据 SELECT user_id, GROUP_CONCAT(product_name) FROM user_orders GROUP BY user_id; -- 结果101 → 手机,耳机,充电器NULL被忽略与CASE/IF结合的表达式拼接支持拼接 “条件表达式” 的结果如将状态值转为文字后拼接语法上直接将表达式作为GROUP_CONCAT的参数即可。示例拼接订单状态1 已支付0 未支付sqlSELECT user_id, GROUP_CONCAT( IF(status1, 已支付, 未支付) -- 条件表达式 ORDER BY order_date SEPARATOR | ) AS order_status_list FROM user_orders GROUP BY user_id;四、常见业务场景场景实现 SQL 示例拼接用户的所有订单号SELECT user_id, GROUP_CONCAT(order_id SEPARATOR ,) FROM orders GROUP BY user_id;按时间排序拼接操作日志SELECT user_id, GROUP_CONCAT(log_content ORDER BY log_time SEPARATOR ;) FROM logs GROUP BY user_id;去重拼接用户标签SELECT user_id, GROUP_CONCAT(DISTINCT tag SEPARATOR ) FROM user_tags GROUP BY user_id;无缝拼接数值成编码SELECT dept_id, GROUP_CONCAT(emp_id ORDER BY emp_id SEPARATOR ) FROM employees GROUP BY dept_id;总结Doris 中的GROUP_CONCAT核心能力是 “分组拼接”通过ORDER BY确保拼接顺序可控通过SEPARATOR自定义分隔符配合DISTINCT可实现去重拼接。实际使用时需注意分组逻辑、结果长度限制、NULL 值处理避免因语法或配置问题导致数据异常。
GROUP_CONCAT 函数用法总结
发布时间:2026/5/23 1:50:46
在 Doris 中GROUP_CONCAT是常用的聚合函数用于将分组内某列的多个值拼接成一个字符串。它支持通过ORDER BY对拼接的元素排序通过SEPARATOR指定元素间的分隔符默认分隔符为英文逗号,。以下从基础语法、核心用法含排序 自定义分隔符、注意事项、常见场景四个维度进行总结确保覆盖实际开发中的高频需求。一、基础语法Doris 中GROUP_CONCAT的完整语法格式如下兼容 MySQL 语法降低学习成本sqlGROUP_CONCAT( [DISTINCT] -- 可选去重后再拼接 列名/表达式 -- 必选需拼接的列或计算表达式如 IF、CASE 结果 [ORDER BY 排序列 [ASC/DESC]] -- 可选对拼接的元素排序 [SEPARATOR 分隔符] -- 可选指定元素间的分隔符默认是 , )关键参数说明参数作用是否必选列名/表达式指定分组内需要拼接的数据来源如某列值、或IF(status1, 正常, 异常)这类计算结果是DISTINCT可选对拼接的元素去重例如同一分组内有重复值只保留一个否ORDER BY 排序列可选对分组内待拼接的元素按指定列排序确保拼接结果的顺序可预期否SEPARATOR 分隔符可选指定元素间的分隔符如 、-、空字符串等默认是,否二、核心用法总结含示例以下示例基于一张模拟的user_orders表数据如下覆盖GROUP_CONCAT与ORDER BY、SEPARATOR的组合用法user_idorder_idorder_dateproduct_nameamount10150012024-05-01手机399910150032024-05-03耳机29910150022024-05-02充电器8910250042024-05-01键盘19910250052024-05-02鼠标991. 基础用法默认分隔符无排序不指定ORDER BY和SEPARATOR默认按数据存储顺序拼接分隔符为,。需求按user_id分组拼接每个用户的订单 ID。sqlSELECT user_id, GROUP_CONCAT(order_id) AS order_id_list -- 默认用 , 拼接无排序 FROM user_orders GROUP BY user_id;结果注意101 的订单 ID 顺序未排序与存储顺序一致user_idorder_id_list1015001,5003,50021025004,50052. 结合ORDER BY按指定字段排序后拼接实际场景中常需要按时间、数值等排序后拼接如按订单日期升序确保结果顺序可预期。需求按user_id分组按order_date升序拼接每个用户的 “订单 ID - 商品名”。sqlSELECT user_id, -- 拼接格式order_id-product_name按 order_date 升序排序 GROUP_CONCAT( CONCAT(order_id, -, product_name) -- 自定义拼接元素格式 ORDER BY order_date ASC -- 按订单日期升序 ) AS order_product_list FROM user_orders GROUP BY user_id;结果101 的订单按日期从早到晚排序5001→5002→5003user_idorder_product_list1015001 - 手机5002 - 充电器5003 - 耳机1025004 - 键盘5005 - 鼠标3. 结合SEPARATOR自定义分隔符默认分隔符是,可通过SEPARATOR指定其他分隔符如|、-、空字符串等。需求按user_id分组用|分隔符拼接商品名且按金额降序排序。sqlSELECT user_id, GROUP_CONCAT( product_name ORDER BY amount DESC -- 按订单金额降序手机耳机充电器 SEPARATOR | -- 自定义分隔符为 | ) AS product_list_by_amount FROM user_orders GROUP BY user_id;结果101 的商品按金额从高到低排序分隔符为|user_idproduct_list_by_amount101手机耳机充电器102键盘鼠标4. 含DISTINCT去重后拼接若分组内某列有重复值如同一用户多次购买同一商品可通过DISTINCT去重后再拼接。需求按user_id分组去重后拼接用户购买的商品类别假设新增category列存在重复。sql-- 模拟表新增 category 列后的数据101重复购买“数码”类商品 SELECT user_id, GROUP_CONCAT( DISTINCT category -- 去重同一类别只保留一次 ORDER BY category ASC SEPARATOR - ) AS distinct_category FROM user_orders GROUP BY user_id;结果101 的 “数码” 类别去重后只出现一次user_iddistinct_category101数码 - 配件102外设5. 空字符串分隔符无缝拼接若需要拼接后无分隔符如将数值拼接成一串数字可指定SEPARATOR 空字符串。需求按user_id分组将订单金额按日期升序无缝拼接如 399929989。sqlSELECT user_id, GROUP_CONCAT( amount ORDER BY order_date ASC SEPARATOR -- 空分隔符无缝拼接 ) AS amount_concat FROM user_orders GROUP BY user_id;结果101 的金额按日期拼接为 39995.1895.22995.3 399989299user_idamount_concat10139998929910219999三、注意事项避坑指南必须搭配GROUP BYGROUP_CONCAT是聚合函数不能单独使用必须配合GROUP BY指定分组字段除非仅聚合全表数据此时GROUP BY可省略但不推荐可读性差。❌ 错误示例无GROUP BY全表聚合仅返回 1 行sqlSELECT GROUP_CONCAT(product_name); -- 不推荐需明确分组逻辑✅ 正确示例按user_id分组sqlSELECT user_id, GROUP_CONCAT(product_name) FROM user_orders GROUP BY user_id;排序字段需在分组上下文内ORDER BY后指定的 “排序列”必须是分组字段、聚合列、或原始表中存在的列不能是其他未关联的列。❌ 错误示例排序列other_col不在表中sqlSELECT user_id, GROUP_CONCAT(product_name ORDER BY other_col) FROM user_orders GROUP BY user_id;结果长度限制默认 1024 字符Doris 中GROUP_CONCAT的默认结果长度限制为1024 个字符若拼接后字符串超长会被截断导致数据丢失。查看当前限制执行SHOW VARIABLES LIKE group_concat_max_len;临时调整限制会话级执行SET group_concat_max_len 102400;设置为 100KB根据需求调整永久调整需在 Doris 配置文件中修改group_concat_max_len参数需重启服务。NULL 值处理若待拼接的列包含NULLGROUP_CONCAT会自动忽略NULL值不拼接NULL也不会用分隔符填充。示例若某用户的product_name有NULL拼接结果会跳过该值sql-- 假设 user_id101 有一条 product_nameNULL 的数据 SELECT user_id, GROUP_CONCAT(product_name) FROM user_orders GROUP BY user_id; -- 结果101 → 手机,耳机,充电器NULL被忽略与CASE/IF结合的表达式拼接支持拼接 “条件表达式” 的结果如将状态值转为文字后拼接语法上直接将表达式作为GROUP_CONCAT的参数即可。示例拼接订单状态1 已支付0 未支付sqlSELECT user_id, GROUP_CONCAT( IF(status1, 已支付, 未支付) -- 条件表达式 ORDER BY order_date SEPARATOR | ) AS order_status_list FROM user_orders GROUP BY user_id;四、常见业务场景场景实现 SQL 示例拼接用户的所有订单号SELECT user_id, GROUP_CONCAT(order_id SEPARATOR ,) FROM orders GROUP BY user_id;按时间排序拼接操作日志SELECT user_id, GROUP_CONCAT(log_content ORDER BY log_time SEPARATOR ;) FROM logs GROUP BY user_id;去重拼接用户标签SELECT user_id, GROUP_CONCAT(DISTINCT tag SEPARATOR ) FROM user_tags GROUP BY user_id;无缝拼接数值成编码SELECT dept_id, GROUP_CONCAT(emp_id ORDER BY emp_id SEPARATOR ) FROM employees GROUP BY dept_id;总结Doris 中的GROUP_CONCAT核心能力是 “分组拼接”通过ORDER BY确保拼接顺序可控通过SEPARATOR自定义分隔符配合DISTINCT可实现去重拼接。实际使用时需注意分组逻辑、结果长度限制、NULL 值处理避免因语法或配置问题导致数据异常。