在sql server中使用case select选择记录

时间:2013-09-25 19:49:45

标签: sql-server if-statement case inner-join exists

DECLARE @Test bit= NULL
SELECT  CASE WHEN @Test = NULL THEN 
    (SELECT * FROM Sales WHERE A =1)
    ELSE
    (SELECT * FROM Sales WHERE A =2)
END

我的查询并不是这么简单,而是在这些方面。我有7个参数用于程序。在实际的存储过程中,首先选择LEFT连接3个其他表(A,B,C)。第二个选择LEFT连接到Sales本身(A,B,Sales)上的前一个和内部联接的2个(A,B)表。我尝试使用union,但第一个选择获取我不应该看到的行。第二个选择带来正确的选择。所以我想我可以做一个案例选择。但我最终得到了这个错误

“当EXISTS没有引入子查询时,只能在选择列表中指定一个表达式。”

有任何想法如何进行?我做错了什么吗?如果您需要更多信息,请询问。感谢。

2 个答案:

答案 0 :(得分:0)

或许只是把它全部放在WHERE

SELECT * 
FROM Sales 
WHERE (@Test IS NULL AND A = 1)
  OR  (@Test IS NOT NULL AND A = 2)

更新:再次阅读您的问题听起来您有不同的FROM情况,在这种情况下使用IF

IF (@Test IS NULL)
  BEGIN
      SELECT * FROM Sales WHERE A = 1
  END
ELSE 
  BEGIN
      SELECT * FROM Sales WHERE A = 2 
  END

答案 1 :(得分:0)

您可以在where子句中应用case语句(aslo使用IS NULL而不是=):

DECLARE @Test bit
set @TEST = NULL

    SELECT * FROM Sales 
    WHERE A = 
            CASE 
                WHEN @Test IS NULL THEN 1 
                ELSE 2 
            END