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

如何在CASE查询中结合IN实现动态数据筛选?

解决方案

一、直接用逻辑条件替代CASE表达式

你之前的错误是因为CASE表达式只能返回单一值,无法返回集合,所以不能直接在IN里嵌套返回多值的子查询。可以直接用逻辑运算符组合条件:

DECLARE @MyValue CHAR(20)
SET @MyValue = '<All>'

SELECT
    RefNo, Name 
FROM
    table1
WHERE 
    (
        (@MyValue IS NULL OR @MyValue = '<All>') 
        AND RefNo IN (SELECT DISTINCT RefNo FROM table2)
    )
    OR
    (@MyValue IS NOT NULL AND @MyValue != '<All>' AND RefNo = @MyValue)

这个写法的逻辑是:

  • 当@MyValue为NULL或''时,匹配table1中RefNo存在于table2的记录
  • 其他情况,匹配table1中RefNo等于@MyValue的记录

二、用IF语句实现

如果偏好分支逻辑,也可以用IF ELSE分开写查询:

DECLARE @MyValue CHAR(20)
SET @MyValue = '<All>'

IF @MyValue IS NULL OR @MyValue = '<All>'
BEGIN
    SELECT
        RefNo, Name 
    FROM
        table1
    WHERE 
        RefNo IN (SELECT DISTINCT RefNo FROM table2)
END
ELSE
BEGIN
    SELECT
        RefNo, Name 
    FROM
        table1
    WHERE 
        RefNo = @MyValue
END

错误原因说明

你之前尝试的写法之所以报错,是因为CASE表达式作为标量表达式只能返回单个值,而SELECT DISTINCT G.RefNo FROM table2会返回多个值,无法被CASE表达式承载,进而导致SQL引擎抛出"子查询返回多个值"的错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 23:20:33