22

我正在尝试查找指定属性不为空或空白的记录。由于它是一个字符串,它在数据库中不是零。

Post.where(:sourceurl != '')

以上似乎应该可以工作,但我仍然会在 source_url 属性为空的地方返回记录。这样做的正确方法是什么?

4

6 回答 6

43

ActiveRecord(我认为在 Rails 3 和 4 中)允许通过将数组作为参数传递来检查多个条件。因此,如果您想同时检查nil'',您可以使用:

where(sourceurl: [nil, ''])

这将生成一个 SQL 条件,如:

(sourceurl IS NULL OR sourceurl = '')

在 Rails 4 中,您可以使用 .not 检查否定条件,因此对于原始问题,您可以这样做:

Post.where.not(sourceurl: [nil, ''])

.not 有一点魔力,使它有利于纯 SQL 查询,因为它可以跨数据库工作,不会自动执行 NOT NULL 查询,还有一些其他事情,如下所述:where.not explain

于 2015-11-06T22:24:19.800 回答
31

试试这个

Post.where("sourceurl <> ''")
于 2012-07-22T12:27:04.747 回答
13

导轨 4

活动记录条件:

where.not(value: '')

范围:

scope :myscope, -> { where.not(value: '') }
于 2014-09-19T02:44:33.760 回答
4

您的代码不起作用的原因是您的参数#where

:sourceurl != ''

计算结果为true,因为:sourceurl(符号)不等于''(空字符串)。因此您的代码与

Post.where(true)

为了详细说明 abhas 的答案,MySQL 和 PostgreSQL 都将接受!=<>作为等效项。

于 2012-07-22T14:12:51.633 回答
3

如果该字段在您的数据库中默认为 NULL,我认为解决它的更好方法是使用普通 SQL:

Post.where("sourceurl is not null")
于 2012-07-22T12:20:34.817 回答
3

在 postgresql 中捕捉空字符串和 nil 你可以这样做:

where("coalesce(sourceurl, '') != ''")
于 2015-06-11T11:12:55.450 回答