我有一张桌子(TableA):
+-----+-------+----------+-----------+----------+
| ID | Owner | Approval | Exception | Type |
+-----+-------+----------+-----------+----------+
| 200 | abc | Approved | NULL | Prepared |
+-----+-------+----------+-----------+----------+
列Exception
可以有NULL, Denied, Returned
等。我正在尝试根据某些条件计算记录数,而NULL
值则无法获得正确的结果。< / p>
我的查询是:
SELECT CASE(WHEN Owner = 'abc' AND Approval = 'Approved' AND Exception <> 'Denied' AND Type = 'Prepared' THEN 1 ELSE 0 END) AS prep1 FROM TableA WHERE ID = 200
以上陈述应该返回1
,但它会返回0
。当我删除Exception
列的条件时,它会返回正确的结果。
答案 0 :(得分:3)
这是因为条件:
Exception <> 'Denied'
这应该是:
ISNULL(Exception, '') <> 'Denied'
OR
AND (Exception IS NULL OR Exception <> 'Denied')
请注意,与NULL
比较时,您应该使用IS NULL
或IS NOT NULL
个关键字。对NULL
进行的任何其他比较将导致UNKNOWN,其出于WHERE
子句或CASE
表达式的目的,为false。为了说明这一点:
SELECT
CASE WHEN NULL = 1 THEN 'TRUE' ELSE 'FALSE' END,
CASE WHEN NULL <> 1 THEN 'TRUE' ELSE 'FALSE' END
将返回:
----- -----
FALSE FALSE
有关NULL
的更多信息,请阅读Robert Sheldon的article。