4

如果我做

SELECT * FROM cte1 c
    WHERE c.GrantNumber NOT IN
    (

      SELECT t1.nai_grant_number FROM #temp t1

    ) 

这工作正常。

但如果我这样做

SELECT * FROM cte1 c
    WHERE c.GrantNumber NOT IN
    (
      CASE WHEN 
                @AutoRenewalChk = 1 THEN
                 (

                     SELECT t1.nai_grant_number FROM #temp t1
                 ) END          
    )

出错

消息 512,级别 16,状态 1,第 33 行子查询返回超过 1 个值。当子查询跟随 =、!=、<、<=、>、>= 或子查询用作表达式时,这是不允许的。

是什么原因?我们不能像上面那样使用 case 语句吗?

谢谢

4

3 回答 3

3
SELECT * FROM cte1 AS c
WHERE NOT EXISTS
(
  SELECT 1 FROM #temp AS t1 
  WHERE t1.nai_grant_number = CASE @AutoRenewalChk 
    WHEN 1 THEN c.GrantNumber END
);

这就是为什么 NOT IN 在这里不起作用的原因。试试这两个查询。你会期望在每种​​情况下都有相同的结果吗?

SELECT x FROM (SELECT x = 1) AS x WHERE x NOT IN 
    (SELECT y = 2);

SELECT x FROM (SELECT x = 1) AS x WHERE x NOT IN 
    (SELECT y = 2 UNION ALL SELECT NULL);

在此处添加可能的 NULL(Dan P 在他的回答中建议将其作为 ELSE,或者如果 #temp 甚至可以包含 nai_grant_number 为 NULL 的单行)完全改变了 NOT IN 的语义。因此,几乎在您考虑编写 NOT IN 查询的任何时候,您都应该将其重新考虑为 NOT EXISTS(或 LEFT OUTER JOIN 或其他结构)。

于 2012-05-04T03:30:52.083 回答
0

就像错误所说的那样,您的查询返回不止一行。如果您更改您的潜艇选择以选择前 1... 它会工作

于 2012-05-04T02:44:44.697 回答
0

试试这个,因为其他人已经提到 CASE When works on a single column or value not a rowset。假设 c.GrantNumber 永远不会为空,这应该适合您。

SELECT * FROM cte1 c 
WHERE c.GrantNumber NOT IN 
( 
    SELECT DISTINCT
        CASE WHEN @AutoRenewalChk = 1
            THEN t1.nai_grant_number
            ELSE NULL
        END
    FROM #temp t1
)
于 2012-05-04T02:57:29.940 回答