2016-04-15 119 views
0

我有这个表过滤器,其中条件

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

我想筛选出的数据(状态= 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 

那么,如何排除数据与状态= REV,但只有当的SecretID IS NOT NULL

我觉得自己很蠢,我无法弄清楚这个简单的例子。任何帮助将不胜感激。

+0

在您预期的结果不应该最后一行是'warheat1990 | 1 | REM'? – dotnetom

回答

6

我认为你应该使用或在您的SQL:

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

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

3

所以,你想去的地方Status <> 'REV'ORSecretId IS NULL返回数据:

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

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

2

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

我们:NOT(状态= REV和的SecretID IS NOT NULL)< =>(状态<> REV或的SecretID IS NULL)

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