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

如何结合CASE、CONTAINS与数组聚合编写SQL查询

解决CASE语句结合聚合函数的分组报错问题

问题分析

你原查询的报错核心是:CASE分支里直接引用了未聚合的project_name字段,同时SET_AGG属于聚合函数,不能出现在GROUP BY子句中。仅按title、owner分组时,未聚合的project_name既不在GROUP BY列表,也没被聚合函数包裹,违反SQL分组规则;若尝试把CASE加入GROUP BY,又因包含聚合函数而不被允许。

正确查询写法

先通过聚合函数获取分组后的必要信息,再在CASE逻辑中使用这些聚合结果或条件聚合字段:

SELECT
    title,
    owner,
    CASE
        WHEN BOOL_OR(team_id = 1234) THEN MAX(CASE WHEN team_id = 1234 THEN project_name END)
        ELSE ARRAY_JOIN(SET_AGG(project_name), ' ')
    END AS project_name
FROM actions
GROUP BY title, owner

代码解释

  • BOOL_OR(team_id = 1234):判断当前分组(title+owner维度)下是否存在team_id=1234的记录,替代原写法中存在参数顺序问题的CONTAINS(SET_AGG(team_id), 1234)。
  • MAX(CASE WHEN team_id = 1234 THEN project_name END):当分组内存在1234团队时,取出对应project_name(若有多条1234团队的记录,MAX会取其中一个,匹配示例需求)。
  • ARRAY_JOIN(SET_AGG(project_name), ' '):当分组内无1234团队时,将所有project_name去重后拼接成字符串(无需去重则替换为ARRAY_AGG)。

验证结果

用你提供的示例数据执行上述查询,将得到期望结果:

titleownerproject_name
test1owner1ProjectA
test2owner1ProjectB
test3owner2ProjectD ProjectE

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 11:27:37