过滤条件

war*_*990 0 sql sql-server sql-server-2012

我有这张桌子

User        | SecretId | Status
warheat1990 |     NULL |    REV
warheat1990 |     NULL |    COM
warheat1990 |        1 |    REV
warheat1990 |        1 |    COM
Run Code Online (Sandbox Code Playgroud)

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

User        | SecretId | Status
warheat1990 |     NULL |    REV
warheat1990 |     NULL |    COM
warheat1990 |        1 |    COM
Run Code Online (Sandbox Code Playgroud)

我的查询

SELECT * FROM TABLE WHERE User = 'warheat1990' AND (Status <> 'REV' AND SecretId IS NULL)
Run Code Online (Sandbox Code Playgroud)

但它没有用,因为它只给了我这条ROW.

User        | SecretId | Status
warheat1990 |     NULL |    COM
Run Code Online (Sandbox Code Playgroud)

那么如何使用Status = REV排除数据,但仅当SecretId不为NULL时才排除数据

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

小智 6

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

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

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