ActiveRecord查询文本字段PostgreSQL

时间:2017-08-22 09:46:26

标签: ruby-on-rails postgresql activerecord

我有一个表产品和大约58000条记录。我运行两个查询如下。

Product.where(description: 'swiss').count

58000 产品中返回 0 产品。但是当我在下面运行查询时。

Product.where.not(description: 'swiss').count

它从 58000 产品中返回 2932 产品。我认为它应该返回所有 58000 产品,因为它与第一个查询相反。 我不明白为什么它只返回 2932 产品。

2 个答案:

答案 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'; =的总数不是所有行,因为您从未包含!=行。这是NULLIS 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)

您可能有许多descriptionnilnot未包含的记录。

包含'nil'记录的方法也是......

Product.where('description <> ? OR description IS NULL', 'swiss')

或者

Product.where.not(description: 'swiss').or(Product.where(description: nil))