WHERE语句中的NULLS - SQL

时间:2015-09-22 20:07:49

标签: sql sql-server tsql

当我在WHERE语句中有条件语句时,NULL是否自动不包括在内?

例如,在GROUP BY语句中包含FROM @data WHERE Trade_Amt > 0 AND Execution_Code != 'EXPIRATION'行的查询中,Execution_Code的{​​{1}}值不会包含在求和中。

如果我包含null,那么我会得到比预期更多的记录。

我发现的唯一解决方法是将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

4 个答案:

答案 0 :(得分:1)

您可以使用()指定您只希望执行代码不等于到期且为空

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

如果您没有(),则无法获得您期望的结果。

答案 1 :(得分:0)

NULL是一种不同的值。它不能被测试大于或小于。因为它既不是。它是NULL。 因此,测试值是否为NULL的唯一方法是:

Select thisvalue from thistable where value is NULL

Select thisvalue from thistable where value is not NULL

因此,在值确实为NULL的情况下,您需要分离这些类型的东西。

答案 2 :(得分:0)

null不是一个值 - 它缺乏价值。对于处理值的任何运算符(例如=!=><like等),它返回一个&#34;未知&#34;结果。因为&#34;未知&#34;不是&#34; true&#34;,除非您使用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

答案 3 :(得分:0)

正如其他人所说,您可以使用括号确保is null成为execution_criteria的一部分。您也可以使用ISNULL函数,如下所示:

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

'X'可以是您想要的任何内容,只要它不是“过期”。如果您的Execution_CodeNULL,则会检查“X”是否不等于“过期”,当然它不会。