如何使用SQL CASE语句新增列标识ID是否关联apple值
实现方案
通过分组判断+CASE赋值的逻辑即可实现需求,不需要多层复杂判断。
通用窗口函数写法(支持MySQL8.0+、PostgreSQL、SQL Server、BigQuery等绝大多数现代数据库)
SELECT ID, Fruit, CASE WHEN MAX(CASE WHEN Fruit = 'apple' THEN 1 ELSE 0 END) OVER (PARTITION BY ID) = 1 THEN 'yes' ELSE 'no' END AS Apple FROM your_table;
逻辑拆解:
- 内层CASE逐行做标记:当前行Fruit值为
apple时返回1,否则返回0 - 用窗口函数
MAX() OVER (PARTITION BY ID)按ID分组取标记的最大值:只要同ID下存在任意一条Fruit为apple的记录,最大值就为1,否则为0 - 外层CASE根据窗口函数的计算结果赋值,值为1则Apple列填
yes,否则填no
老版本数据库兼容写法(适配MySQL5.x等不支持窗口函数的环境)
SELECT t1.ID, t1.Fruit, CASE WHEN t2.has_apple = 1 THEN 'yes' ELSE 'no' END AS Apple FROM your_table t1 LEFT JOIN ( SELECT ID, MAX(CASE WHEN Fruit = 'apple' THEN 1 ELSE 0 END) AS has_apple FROM your_table GROUP BY ID ) t2 ON t1.ID = t2.ID;
逻辑拆解:
- 先写子查询按ID分组,提前计算好每个ID是否关联apple的标记
has_apple - 通过ID关联把分组标记映射回原表的每一行
- 最后用CASE判断标记值,给Apple列赋值即可
内容的提问来源于stack exchange,提问作者Shahin
相关产品推荐
相关产品推荐

