【问题标题】:How do I modify this where clause to check if a column has a nil value in SQL?如何修改此 where 子句以检查列在 SQL 中是否具有 nil 值?
【发布时间】:2015-11-05 22:48:09
【问题描述】:

我有以下疑问:

user.all_memberships.where("user_id = ? OR invited_id = ?", user2.id, user2.id)

这就是我的membership 模型的样子:

#<Membership id: 4, family_tree_id: 3, user_id: 1, created_at: "2015-10-23 20:33:41", updated_at: "2015-10-23 20:33:41", relation: nil, invited_id: nil>

我希望查询还检查relation != nil....但不确定如何在传递给where 子句的SQL 中用引号表示。

换句话说,我希望它在user_idinvited_id 列中检查user2.id 的存在。但是...relation 也必须不为零。

我该怎么做?

编辑 1

当我按照以下 Blindy 的建议进行以下查询时:

user.all_memberships.where("relation is not null and user_id = ? OR invited_id = ?", user2.id, user2.id)

它会生成这个查询,这似乎可以工作,但基于它生成的 SQL,我对此感到紧张。请注意该语句的第二个 AND 和第二部分。感觉它可能偶尔会返回误报。

(0.9ms) SELECT COUNT(*) FROM "memberships" WHERE (memberships.user_id = 1 OR memberships.invited_id = 1) AND (relation is not null and user_id = 2 OR invited_id = 2)

如何自定义 AR where 查询以更真实地执行我想要做的事情并且没有任何隐藏的陷阱?

【问题讨论】:

    标签: sql ruby-on-rails postgresql ruby-on-rails-4 activerecord


    【解决方案1】:

    这并不完全清楚,但我认为您的意思是:

    relation is not null and (user_id = ? OR invited_id = ?)
    

    【讨论】:

    • 到目前为止这有效。它生成这条 SQL 语句:(0.9ms) SELECT COUNT(*) FROM "memberships" WHERE (memberships.user_id = 1 OR memberships.invited_id = 1) AND (relation is not null and user_id = 2 OR invited_id = 2)。注意第二个AND 和该语句的第二部分。感觉它可能偶尔会返回误报……我错了吗?
    • 是的,这是错误的,它正在去掉括号。我会替换太糟糕的库,无法处理这样一个简单的查询。
    • 我正在使用 ActiveRecord,因此实际上无法替换库。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多