2015-09-22 54 views
2

當我在我的WHERE語句中有條件語句時,是否自動不包含NULLNULLS在WHERE語句中 - SQL

例如,在與具有線FROM @data WHERE Trade_Amt > 0 AND Execution_Code != 'EXPIRATION'Execution_Code值是null將不包括在求和一個GROUP BY語句的查詢。

如果我包括OR Execution_Code IS NULL,那麼我會得到比預期更多的記錄。

我發現的唯一工作是將null值更改爲指定的字符。這是我唯一的選擇還是我錯過了什麼?

一個例子:

@data

Trade_Amt  Execution_Code Trade_Px 
----------------------------------------- 
4     XVD    5 
-4     NULL   5 
4     NULL   5 
5     EXPIRATION  5 

查詢:

SELECT 
    SUM(Trade_Amt) AS [Trade_Amt], 
    dbo.ConcatStr(DISTINCT Execution_Code , ',', 'ASC') AS [Execution_Code], 
    Trade_Px 
    --above line concatenates execution code strings together during summation 
FROM 
    @data 
WHERE 
    Trade_Amt > 0 AND Execution_Code != 'EXPIRATION' 
GROUP BY 
    Trade_Px 

預期輸出:

Trade_Amt  Execution_Code  Trade_Px 
-------------------------------------------- 
    8     XVD    5 

我居然得到:

Trade_Amt  Execution_Code  Trade_Px 
-------------------------------------------- 
    4     XVD    5 
+0

爲什麼答案是_0_?因爲where子句只包含'trade_amt> 0'? –

+0

另外,包含'is null'的查詢不適合你。 –

+0

它是Trade_Amt的總和。 – pavbagel

回答

1

您可以使用()指定您只需要那些不等於到期執行代碼和爲空

WHERE Trade_Amt > 0 AND (Execution_Code != 'EXPIRATION' OR Execution_Code IS NULL) 

如果沒有()做,你不會得到結果你在期待。

+0

我試過了,我得到了比預期更多的記錄。請記住,上面的示例只是一個更大的數據集的片段 – pavbagel

+0

您是否使用括號? – tcigrand

+0

不錯,工作。我之前沒有包括括號。謝謝!!但我仍然不明白爲什麼我必須包含null。 – pavbagel

0

NULL是一種不同的價值。它不能被測試爲大於或小於。因爲它既不是。它是NULL。 所以測試如果值爲NULL的唯一辦法是:

Select thisvalue from thistable where value is NULL 

Select thisvalue from thistable where value is not NULL 

所以,你需要在情況下,值確實可以爲NULL這些事情分開。

0

null不是一個值 - 它是缺乏它的價值。對於處理值的任何運營商(例如=,!=,>,<, like等),它會返回「未知」結果。由於「未知」是不是「真」,在這樣的條件將排除null值,除非你明確地使用is操作處理它們:

SELECT SUM(Trade_Amt), 
     dbo.ConcatStr(DISTINCT Execution_Code , ',', 'ASC') AS [Execution_Code], 
     Trade_Px 
FROM  @data 
WHERE (Trade_Amt IS NULL OR Trade_Amt > 0) AND 
     (Execution_Code IS NULL OR Execution_Code != 'EXPIRATION') 
GROUP BY Trade_Px 
0

正如其他人所指出的那樣,你可以使用括號來確保is null是一部分你的execution_criteria。您也可以使用ISNULL功能,像這樣:

WHERE Trade_Amt > 0 AND ISNULL(Execution_Code, 'X') != 'EXPIRATION' 

哪裏'X'可以是任何你想要的,只要它不是「過期。'如果你的Execution_CodeNULL,它會改爲檢查'X'不等於'過期',這當然不會。