You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确实现json_group_array替代group_concat的多表聚合查询?

解决方案

问题核心是json_group_array在无数据时返回空数组[]而非NULL,导致IFNULL无法触发备选查询。可以通过以下几种方式解决:

方法一:将空数组转换为NULL

在子查询中用CASE判断结果是否为空数组,若是则返回NULL,让IFNULL正常生效:

SELECT
    Col1,
    Col2,
    IFNULL(
        (SELECT CASE WHEN json_group_array(SomeColumn) = '[]' THEN NULL ELSE json_group_array(SomeColumn) END FROM RelationOne),
        (SELECT json_group_array(SomeColumn) FROM RelationTwo)
    )
FROM MainTable

方法二:先判断表是否存在数据

通过EXISTS先检查RelationOne是否有记录,再决定查询哪个表的数组,逻辑更直观:

SELECT
    Col1,
    Col2,
    CASE
        WHEN EXISTS(SELECT 1 FROM RelationOne) THEN (SELECT json_group_array(SomeColumn) FROM RelationOne)
        ELSE (SELECT json_group_array(SomeColumn) FROM RelationTwo)
    END
FROM MainTable

方法三:用JSON_LENGTH判断空数组(兼容多数SQL方言)

如果你的SQL环境支持JSON_LENGTH函数(如MySQL 8.0+),可以用它判断数组长度是否为0,替代字符串比较,兼容性更好:

SELECT
    Col1,
    Col2,
    IFNULL(
        (SELECT CASE WHEN JSON_LENGTH(json_group_array(SomeColumn)) = 0 THEN NULL ELSE json_group_array(SomeColumn) END FROM RelationOne),
        (SELECT json_group_array(SomeColumn) FROM RelationTwo)
    )
FROM MainTable

内容的提问来源于stack exchange,提问作者TheHvidsten

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 01:52:04