当我在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
答案 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_Code
为NULL
,则会检查“X”是否不等于“过期”,当然它不会。