在SQL中未验证NULL值

时间:2016-03-03 06:24:40

标签: sql-server validation null

我有一张桌子(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列的条件时,它会返回正确的结果。

1 个答案:

答案 0 :(得分:3)

这是因为条件:

Exception <> 'Denied'

这应该是:

ISNULL(Exception, '') <> 'Denied'

OR

AND (Exception IS NULL OR Exception <> 'Denied')

请注意,与NULL比较时,您应该使用IS NULLIS 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