如何在SQL中编写多个不等于AND子句?

时间:2013-11-21 20:04:26

标签: sql sql-server tsql

我使用tsql编写查询,而我的where子句似乎返回了太多结果。它出于某种原因似乎将我的Not equal AND Clause视为OR子句。

SELECT * 
  FROM [dbo].TestTable 
  WHERE 
  ([SomeID] <> 0) 
  AND
  ([BlahID] <> 0)
  AND
  ([TestID] <> 0)
  AND
  ([AnotherID] <> 0)

  ORDER By ID

我需要它只返回所有四列不等于零的行。现在它正在删除任何列等于零的行。

我的表:

ID   SomeID   BlahID   TestID   AnotherID
1     0        1        4         0    
2     0        4        4         8
3     0        0        4         0
4     0        1        4         0
5     6        1        4         3

我希望它返回

ID   SomeID   BlahID   TestID   AnotherID
1     0        1        4         0    
2     0        4        4         8
4     0        1        4         0
5     6        1        4         3

它返回什么

ID   SomeID   BlahID   TestID   AnotherID
5     6        1        4         3

4 个答案:

答案 0 :(得分:2)

  

它不会返回任何这些列中任何一个零的行   并非所有这些列

这正是您的查询的全部内容。它返回行,在您列出的任何列中都没有0

这是因为如果任何AND部分被评估为false,则整个条件也是false。如果是,例如TestID = 0,整个WHERE子句为false,并且未返回该行。

要获取其中至少有一列具有非零值的行,请使用OR

答案 1 :(得分:0)

更容易阅读(至少对我而言)

从未有过的记录和id = 0

SELECT * 
  FROM [dbo].TestTable 
  WHERE 0 NOT IN ([SomeID],[BlahID],[TestID],[AnotherID])

至少有一个ID&lt;&gt;的记录0

SELECT * FROM TestTable
WHERE EXISTS (
  SELECT 1
  FROM (VALUES(SomeID),(BlahID),(TestID),(AnotherID)) t(id)
  WHERE id <> 0
)

答案 2 :(得分:0)

  

我需要它只返回所有四列不相等的行   零。现在它正在删除任何列相等的行   为零。

根据您的措辞和修订更新,您希望使用OR代替AND。不确定该链接是否有效,但you can check out this SQL Fiddle

答案 3 :(得分:0)

使用

SELECT * FROM [dbo].TestTable WHERE [BlahID] <> 0

问题不在于您的查询,而是您期望的结果。表中的每一行在至少一列中都有一个非零值,因此查询返回整个表。