0

我有以下完整查询,它什么也不返回。

@companies.where("(companies.status = 'active' AND (companies.status_override = '' OR companies.status_override = NULL)) OR companies.status_override = 'active'")

我希望第一部分(companies.status = 'active' AND (companies.status_override = '' OR companies.status_override = NULL))将返回所有status设置为“活动”并status_override设置为空的项目。

4

2 回答 2

2

在不知道数据库结构的情况下,这= NULL是一个嫌疑犯。试试IS NULL吧。

与 NULL 进行算术比较的行为并不像您预期​​的那样;更多细节可以在Mysql 参考中找到

于 2012-07-18T15:14:40.273 回答
1

最可能的解释是没有任何行满足 WHERE 子句中的谓词。您的 where 子句采用以下形式:

( a AND ( b OR c ) ) OR d

在哪里

a = companies.status = 'active'
b = companies.status_override = '' 
c = companies.status_override = NULL
d = companies.status_override = 'active'

所以,基本上,我们知道表中没有任何行满足条件d。而且我们知道没有任何行同时满足条件ab.

条件c是不可能的;它永远不会满足。

要测试表达式是否包含 NULL,请使用expr IS NULL. IE

companies.status_override IS NULL

如果您不关心 status_override 列上的索引范围扫描操作(很可能您不关心),您可以使用 IFNULL() 函数进行一些简化...

(companies.status = 'active' AND IFNULL(companies.status_override,'') = '') OR companies.status_override = 'active'

或使用该NULLIF()功能

(companies.status = 'active' AND NULLIF(companies.status_override,'') IS NULL) OR companies.status_override = 'active'
于 2012-07-18T15:26:39.390 回答