2014-09-11 79 views
-1

我想根据其他列的值(如下所示)在SQL中应用不同的条件。 对不起,我更新我的阙更具体的要求SQL where子句在相同的值上有多个条件

SELECT * FROM TABLEDetails 
WHERE CASE WHEN 
    ConfigValue = 'FALSE' THEN 
       (ConfigAmount != 0 OR ConfigVolume != 0) 
    WHEN ConfigValue = 'TRUE' THEN 
     (ConfigAmount != 0 OR ConfigVolume <Here, it should allow Zero too with other values> 
    END 
+0

你的编辑完全改变你的问题。现在我甚至不明白你想要什么。请提供样本数据和预期结果。 – 2014-09-11 13:55:21

+0

我有表conatins ConfigAmount和ConfiguVolume与ConfigValue'真'和'假'。如果ConfigValue是'False',那么在ConfigVolume中它不应该允许0。在这两种情况下,它不应该在ConfigAmount中允许0。 – NeilSah 2014-09-11 13:58:20

+0

我明白了,什么意思是“允许零与其他值”?允许0和其他一些值,或允许一切? – 2014-09-11 13:59:50

回答

3

只需使用AND S和OR S:在您的查询

SELECT * FROM TABLEDetails 
WHERE (ConfigValue = 'FALSE' AND ConfigVolume != 0) 
    OR (ConfigValue = 'TRUE' AND ConfigVolume = 0) 

CASE WHEN返回结果的表达式,也没有比较喜欢。

正如@Pred所述,WHERE子句必须包含比较。

参见MSDN

您的编辑之后(这完全BTW改变了要求),我想这样的事情可以工作,但现在的问题是相当清楚:

SELECT * FROM TABLEDetails 
WHERE (ConfigValue = 'FALSE' AND (ConfigAmount != 0 OR ConfigVolume != 0)) 
    OR (ConfigValue = 'TRUE' AND (ConfigAmount != 0 OR ConfigVolume IN (0, 1, 2, ... /* add as many values you need*/))) 
+0

不,你可以在'WHERE'子句中使用'CASE..WHEN',但是你必须**将这个子句的reult与另一个表达式(比如一个列或一个常量值)进行比较。原始查询的主要问题是'WHERE'子句不包含comprasions。 – Pred 2014-09-11 13:20:04

+0

@Pred是的,我知道,我在编辑你的评论时...... :) – 2014-09-11 13:20:49

1

@XLAnt写了一个正确的和优秀的答案,但完成可能解决方案的列表。这里是一个与CASE..WHEN条款:

SELECT 
    * 
FROM 
    TABLEDetails 
WHERE 
    ConfigValue = CASE 
     WHEN ConfigVolume != 0 THEN 'FALSE' 
     WHEN ConfigVolume = 0 THEN 'TRUE' 
    END 

请注意,该CASE..WHEN子句返回NULL如果没有ELSE条件,没有一个WHEN条件得到满足。 (这将过滤所有ConfigValue < 0为真的记录,因为NULL不等于任何东西)。

+0

嗨,对不起,我编辑了我的问题。你能帮我看看吗? – NeilSah 2014-09-11 13:53:08

+1

逻辑是一样的。 @ X.L.Ant的答案更易读,易于维护。我建议尝试根据您的新要求修改他的查询。 – Pred 2014-09-11 14:02:25