2011-02-18 120 views
7

有没有办法测试0和NULL与一个相等运算符?SQL布尔真值测试:零或空

我知道我可以做到这一点:

WHERE field = 0 OR field IS NULL

但我的生活会一百倍更容易,如果这会工作:

WHERE field IN (0, NULL)

(顺便说一句,为什么不那工作?)

我也读过关于将SELECT语句中的NULL转换为0(与COALESCE)。我正在使用的框架也会使这个不愉快。

认识到这是奇怪的具体,但有没有什么办法来测试0和NULL与一个WHERE谓词?

+0

回答了 “为什么不这项工作” 的一部分:'WHERE领域IN(0,NULL)``是WHERE字段= 0或字段= NULL`最后一种情况是`unknown` – 2011-02-18 20:26:03

+1

如果您扩展你的IN子句,它应该更清楚它为什么不起作用:`field IN(0,NULL)`相当于`field = 0 OR field = NULL`,你不能使用“=”运算符来测试对于NULL,结果是未知的。 – 2011-02-18 20:28:33

回答

6

它不起作用,因为field In(0,Null)相当于field = 0 Or field = Null而不是field = 0 Or field Is Null。一种选择是使用CASE表达式:

Case 
When field = 0 Then 1 
When field Is Null Then 1 
End = 1 

更好的选择是与你原来的field = 0 OR field Is Null坚持,因为它使你的意图更清晰。

0

您的WHERE声明更好IMO,但您可以尝试WHERE !IFNULL(field, 0)

8

我会使用手动IFNULL功能写的比较:

IFNULL(field, 0) = 0 

而且响应您对IN功能问题:

“为了符合SQL标准中, 回报NULL不仅如果 表达式在左边是 NULL,而且如果在 中找到不匹配的列表和 中的一个表达式l ist是NULL。“ - the docs