如何正确实现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
相关产品推荐
相关产品推荐

