过滤条件

时间:2016-04-15 03:52:46

标签: sql sql-server sql-server-2012

我有这张桌子

User        | SecretId | Status
warheat1990 |     NULL |    REV
warheat1990 |     NULL |    COM
warheat1990 |        1 |    REV
warheat1990 |        1 |    COM

我想过滤掉数据(Status = REV和SecretId IS NOT NULL合并),所以最终结果将是

User        | SecretId | Status
warheat1990 |     NULL |    REV
warheat1990 |     NULL |    COM
warheat1990 |        1 |    COM

我的查询

SELECT * FROM TABLE WHERE User = 'warheat1990' AND (Status <> 'REV' AND SecretId IS NULL)

但它不起作用,因为它只给我这条行。

User        | SecretId | Status
warheat1990 |     NULL |    COM

那么我如何排除Status = REV的数据,但仅当SecretId IS NOT NULL

我觉得我无法弄清楚这个简单的案例。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:6)

我认为你应该在你的SQL中使用OR:

SELECT * FROM TABLE WHERE User = 'warheat1990' AND (Status <> 'REV' OR SecretId IS NULL)

这是数学知识:你想匹配条件“不(A和B)”,那么你可以使用等效表达式((不是A)或(不是B)),所以你应该使用OR而不是AND。

答案 1 :(得分:3)

因此,您希望返回Status <> 'REV' SecretId IS NULL的数据:

SELECT * 
FROM TABLE 
WHERE User = 'warheat1990' AND 
    (Status <> 'REV' OR SecretId IS NULL)

使用AND时,只能获得满足这两个条件的行。当您使用OR时,您将获得至少符合一个条件的行。

答案 2 :(得分:2)

所以你想要选择all,除了(Status = REV和SecretId IS NOT NULL)?

我们有:NOT(Status = REV和SecretId IS NOT NULL)&lt; =&gt; (状态&lt;&gt; REV或SecretId为空)

SELECT * FROM TABLE WHERE User = 'warheat1990' AND (Status <> 'REV' or SecretId IS NULL)