我有一个表产品和大约58000条记录。我运行两个查询如下。
Product.where(description: 'swiss').count
从 58000 产品中返回 0 产品。但是当我在下面运行查询时。
Product.where.not(description: 'swiss').count
它从 58000 产品中返回 2932 产品。我认为它应该返回所有 58000 产品,因为它与第一个查询相反。 我不明白为什么它只返回 2932 产品。
答案 0 :(得分:1)
如果您的列中包含NULL值,则可能会发生这种情况,因为$ git mergetool
始终比较为NULL
,甚至是自身,但NULL
表达式必须为true才能包含结果。
WHERE
e.g。考虑包含
的表'a' = 'a'; True
'a' = 'b'; False
'a' = NULL; Results in NULL (not false!)
NULL = NULL; Results in NULL (not true!)
'a' != 'a'; False
'a' != 'b'; True
'a' != NULL; NULL
null_test
当查找等于某个值的列时, id | str
----+-----
1 | <NULL>
2 | a
3 | b
永远不会相等,所以这将只返回第2行。
NULL
但同样适用于查找 列等于某个值,SELECT id FROM null_test WHERE str = 'a';
永远不等于(其NULL),因此这将返回第3行。
NULL
因此,SELECT id FROM null_test WHERE str != 'a';
和=
的总数不是所有行,因为您从未包含!=
行。这是NULL
和IS NULL
进来的地方(它们可能会像您预期的那样工作IS NOT NULL
和= NULL
)。
!= NULL
现在你得到第1行和第3行,这与SELECT id FROM null_test WHERE str != 'a' OR str IS NULL;
相反。
对于str = 'a'
,它会像处理SQL ActiveRecord
一样处理Ruby nil
值,并在某些情况下创建NULL
检查。
IS NULL
答案 1 :(得分:0)
您可能有许多description
为nil
且not
未包含的记录。
包含'nil'记录的方法也是......
Product.where('description <> ? OR description IS NULL', 'swiss')
或者
Product.where.not(description: 'swiss').or(Product.where(description: nil))