SQL将CASE语句移至子查询外无法识别title、body字段问题求解
报错原因
你把CASE移到外层时系统识别不了title、body字段,是因为外层查询只能访问子查询返回的列,原来的子查询没有把这两个字段包含在返回结果里,自然无法调用。
调整后的SQL代码
SELECT CASE WHEN UPPER(title) LIKE '%AGREE%' OR UPPER(body) LIKE '%AGREE%' THEN 'YES' ELSE 'NO' END AS "是/否", year AS "年份", ROUND(avg(view_count),2) AS "平均数量" FROM ( SELECT EXTRACT(YEAR FROM creation_date) AS year, view_count, title, body FROM posts_questions WHERE UPPER(title) LIKE '%AGREE%' OR UPPER(body) LIKE '%AGREE%' OR UPPER(title) LIKE '%DISAGREE%' OR UPPER(body) LIKE '%DISAGREE%' ) x GROUP BY year, "是/否" ORDER BY year;
逻辑说明
- 子查询仅做基础数据过滤和必要字段提取,把后续计算需要用到的年份、浏览量、标题、内容字段全部返回,去掉了原代码子查询里不必要的分组、排序逻辑,性能更优
- CASE判断移到外层查询的字段定义部分,直接调用子查询返回的
title、body字段即可正常运行,最终输出的三列完全匹配需求 - 修正了原代码的隐含问题:原外层聚合用了
view_count字段,但原逻辑的子查询没有返回该字段,调整后已补全
内容的提问来源于stack exchange,提问作者steve_27
相关产品推荐
相关产品推荐

