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

如何根据整数数组列的聚合函数值筛选表中的记录?

嘿,这个需求其实挺常见的,不过得看你用的是什么数据库,不同数据库处理数组的方式差别还挺大的,我给你整理几种主流数据库的实现方式:

针对不同数据库的解决方案

PostgreSQL(原生支持数组类型)

PostgreSQL对数组的支持非常友好,有两种常用方法:

方法1:使用内置array_max函数(PostgreSQL 12及以上版本)

这个函数可以直接返回数组中的最大值,写法最简洁:

SELECT *
FROM foos
WHERE array_max(numbers) > 6;

方法2:兼容旧版本的unnest展开法

如果你的PostgreSQL版本低于12,没有array_max函数,可以用unnest把数组拆分成单行数据,再聚合计算最大值:

SELECT *
FROM foos
WHERE (SELECT MAX(n) FROM unnest(numbers) AS n) > 6;

运行上面的查询后,会返回id=2的记录(它的numbers数组最大值是9,大于6)。

MySQL(推荐用JSON数组存储)

MySQL原生没有专门的数组类型,通常会用JSON格式来存储数组。我们可以通过JSON_TABLE把JSON数组拆成行,再计算聚合值:

SELECT *
FROM foos
WHERE (
    SELECT MAX(CAST(j.value AS UNSIGNED))
    FROM JSON_TABLE(numbers, '$[*]' COLUMNS(value INT PATH '$')) AS j
) > 6;

如果你的MySQL版本低于8.0,不支持JSON_TABLE,可以考虑用自定义函数来实现数组最大值的计算,但这种方式不如上面的方法高效。

SQL Server

情况1:numbers是JSON数组类型

用OPENJSON展开数组后聚合筛选:

SELECT f.*
FROM foos f
CROSS APPLY OPENJSON(f.numbers) WITH (value INT '$') AS j
GROUP BY f.id, f.numbers
HAVING MAX(j.value) > 6;

情况2:numbers是逗号分隔的字符串

如果数组是以逗号分隔的字符串存储(比如'7,8,9'),可以用STRING_SPLIT拆分后计算:

SELECT f.*
FROM foos f
CROSS APPLY STRING_SPLIT(f.numbers, ',') AS s
GROUP BY f.id, f.numbers
HAVING MAX(CAST(s.value AS INT)) > 6;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:23:33