2010-08-11 69 views
0

我需要编写一个查询这样的事情:SQL Sever的:在... ...的情况下在WHERE子句

Select [something] 
Where 
condition in 
case 
when (if another_condition = A and 3rd Condition = B) then (C,D) 
when (if another_condition = N and 3rd Condition = E) then (F,G) 
else (J,K) 
end 

基本上,我要的是如果A和B都满足,条件可以设置为C或D,如果满足N或E,则条件可以设置为F或G,否则条件设置为J或K. 但是,当我运行此操作时,我一直在获取 语法附近的语法不正确关键字'Case'。

请帮忙!谢谢!

+0

你的CASE语句中'设置为C或D'是什么意思?遇到相同的CASE条件时,您不能得到2个不同的结果。 – flayto 2010-08-11 13:09:05

+0

要解决CASE错误,请将CASE语句放在括号中。 – 2010-08-11 13:09:29

回答

2

也许这:

Where (Another_Condition = 'A' And Third_Condition = 'B' And Condition in ('C','D')) 
     Or 
     (Another_Condition = 'N' and Third_Condition = 'E' And Condition in ('F','G')) 
     Or 
     Condition In ('J','K') 

非常小心混合的和或在where子句。括号很重要。

+0

我也想提出这个建议。我认为你的最终OR子句是错误的,因为它将为每一行测试条件IN('J','K'),而不像CASE ... ELSE,它将只对与第一行不匹配的行进行测试两个条款。 最后一行应为: NOT((Another_Condition ='A'AND Third_Condition ='B')OR(Another_Condition ='N'AND Third_Condition ='E'))AND条件IN('J','K “) – 2010-08-11 13:37:20

1

这怎么样 - UNION子查询会给你在子查询中的完整结果集。然后你可以说'WHERE condition IN'(子查询)。就像这样:

SELECT [something] 
WHERE 
condition IN 
(SELECT CASE WHEN (another_condition = A AND 3rd Condition = B) THEN C 
    WHEN (another_condition = N AND 3rd Condition = E) THEN F 
    ELSE J 
    END AS Value 

UNION 

SELECT CASE WHEN (another_condition = A AND 3rd Condition = B) THEN D 
    WHEN (another_condition = N AND 3rd Condition = E) THEN G 
    ELSE K 
    END AS Value 
) 
+0

非常感谢所有人的回答,我使用了G Mastro的方法,它效果很好!谢谢! – AZhu 2010-08-13 11:02:34

1

我可能会用G Mastro的方法来扩展查询作为布尔表达式。尽管嵌套查询方法可行,但代码的意图不太明显。尽管如此,如果您的CASE语句中有很多情况,您可能需要考虑重新整理数据,因为无论您如何编写查询,它都归结为一个大的布尔表达式。