2013-11-21 23 views
-2

我正在使用tsql來寫查詢和我的where子句似乎返回太多的結果。由於某種原因,它似乎將我的不等於AND子句視爲OR子句。如何寫一個multple在TSQL中不等於AND子句?

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 
+3

純粹基於您的示例代碼,這不應該發生。我認爲我們需要看到真實的代碼和返回值的例子。 – EkoostikMartin

+0

查詢是否返回比您想要的更多的行或更少的行? –

+0

它返回的行數少於預計的數 – AndrewBrntt

回答

2

它使沒有返回有在零任何行什麼這些列中的任何一列都不是全部這些列

這正是您的查詢的全部內容。它將返回行,在列出的任何列上都不會有0

這是因爲如果AND部件中的任何一部件被評估爲false整個條件也是false。所以如果例如TestID = 0,整個WHERE子句是false並且該行不被返回。

要獲得至少其中一列具有非零值的行,請使用OR

+0

OP說他的查詢返回的結果太多了,而且似乎將'AND'視爲'OR',不知道你的答案如何解決... – EkoostikMartin

+0

@EkoostikMartin平心而論,OP的原始問題完全不明確。 「它不會返回任何這些列中有零的行[不是所有列]」 – OGHaza

+0

這確實是正確的答案。 – OGHaza

0

更易於讀取(對我來說,至少)

從未有與記錄ID = 0

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

記錄具有至少一個ID <> 0

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

我需要它只返回所有四列不等於 零的行。現在它將刪除任何列等於 爲零的行。

根據您的措辭和修訂更新,您所需要的是使用OR而不是AND。不確定鏈接是否可以正常工作,但是you can check out this SQL Fiddle

+0

但你剛剛引用的是與之相反的。當然你是對的,因爲他的預期產出清楚地表明他完全錯誤地表達了他想要的東西。 – OGHaza

+0

是的,我想他可能想要或但我正在等待澄清。 – Matt

0

使用

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

的問題是不是你的查詢,這是你所期望的結果。表中的每一行在至少一列中都有一個非零值,因此查詢將返回整個表。