使用IN语句选择多值时出现‘Too Many Values’问题
问题描述
我尝试用CASE语句让IN子句根据条件返回不同的年份集合,SQL语句如下:
WHERE year in ( CASE WHEN expression THEN (select yearOne, yearOne - 1 from table) ELSE (select yearOne from table) END )
举个例子:
- 当
yearOne为2023,expression为真时,期望WHERE子句是:WHERE year in (2023, 2022) - 当
expression为假时,仅匹配2023:WHERE year in (2023)
但执行时出现了**"Too Many Values"**错误,需要解决这个问题。
解决方案
方法1:直接用逻辑表达式替代CASE
不需要用CASE包裹,通过OR和AND组合条件即可实现需求,逻辑更清晰:
WHERE (expression = TRUE AND year IN (SELECT yearOne FROM table, SELECT yearOne - 1 FROM table)) OR (expression = FALSE AND year IN (SELECT yearOne FROM table))
更简洁的写法可以直接过滤年份:
WHERE year = (SELECT yearOne FROM table) OR (expression = TRUE AND year = (SELECT yearOne - 1 FROM table))
方法2:用UNION ALL构造动态结果集
如果需要通过子查询返回动态年份列表,可结合UNION ALL和条件过滤:
WHERE year IN ( SELECT yearOne FROM table UNION ALL SELECT yearOne - 1 FROM table WHERE expression = TRUE )
这种方式下,expression为真时,第二个子查询返回yearOne-1,最终集合包含两个年份;expression为假时,第二个子查询无结果,集合仅保留yearOne。
原写法报错原因
CASE语句的核心是返回单个值,无法返回多列或多行结果。原代码中THEN分支返回两个值(yearOne和yearOne-1),违反了CASE的单值返回规则,因此触发"Too Many Values"错误。
内容的提问来源于stack exchange,提问作者Adam Bundschuh
相关产品推荐
相关产品推荐

