0

您好,这是我的 SQL 查询:

WHERE table1.Regnumber IN (
    CASE 
        WHEN @fRegNumber IS NOT NULL AND @fRegNumber<>-1 THEN @fRegNumber
        ELSE (SELECT Regnumber FROM table2)
    END
)

一个错误:

'子查询返回超过 1 个值。当子查询跟随 =、!=、<、<=、>、>= 或子查询用作表达式时,这是不允许的。

我怎样才能解决这个问题?

4

3 回答 3

1

我可以在这里看到两种方法。以这种方式保留CASE声明:

WHERE
    CASE    WHEN    COALESCE(@fRegNumber, -1) == -1
            THEN    t1.regnumber IN (SELECT t2.regnumber FROM table2))
            ELSE    t1.regnumber = @fRegNumber
    END

另一个将整个CASE语句改写为适当的逻辑运算符:

WHERE
  (COALESCE(@fRegNumber, -1) != -1 AND t1.regnumber = @fRegNumber) OR
  (COALESCE(@fRegNumber, -1) == -1 AND t1.regnumber IN (SELECT t2.regnumber FROM table2))
于 2013-11-02T15:47:15.703 回答
1

改成:

WHERE IF(@fRegNumber IS NOT NULL AND @fRegNumber<>-1,
         table1.Regnumber = @fRegnumber),
         table1.Regnumber IN (SELECT Regnumber FROM table2))

WHERE x IN可以通过两种方式使用:

WHERE x IN (expr1, expr2, expr3, ...)

在这种情况下,如果您使用子查询作为表达式,它必须只返回一个值。返回多个值的子查询不会被拼接进去。

或者:

WHERE x IN (subquery)

这是允许子查询返回多行的格式,并将x针对所有行进行测试。

由于您想要条件化是针对单个值还是子查询的结果进行测试,所以您必须在子句之外使用.INIF

可能还有其他方法可以将此查询编写为 LEFT JOIN。

于 2013-11-02T15:07:09.970 回答
1

问题出在这个子查询上。

(SELECT Regnumber FROM table2)

它从表中返回每个 regnumber。在整个查询的上下文中,您只需选择一个。解决问题的第一步是决定你想要哪个以及为什么。

于 2013-11-02T15:07:21.867 回答