当前位置: 首页 > 面试题库 >

如何通过使用Arel在带有'or'和'and'子句的SQL查询中正确添加括号?

李文轩
2023-03-14
问题内容

我正在使用Ruby on Rails 3.2.2,并且想生成以下SQL查询:

SELECT `articles`.* FROM `articles` WHERE (`articles`.`user_id` = 1 OR `articles`.`status` = 'published' OR (`articles`.`status` = 'temp' AND `articles`.`user_id` IN (10, 11, 12, <...>)))

通过使用阿雷尔这样

Article
 .where(
   arel_table[:user_id].eq(1)
   .or(arel_table[:status].eq("published"))
   .or(
     arel_table[:status].eq("temp")
     .and(
       arel_table[:user_id].in(10, 11, 12, <...>)
     )
  )
)

它生成以下内容( 注意 :方括号与第一个SQL查询不同):

SELECT `articles`.* FROM `articles` WHERE (((`articles`.`user_id` = 1 OR `articles`.`status` = 'published') OR `articles`.`status` = 'temp' AND `articles`.`user_id` IN (10, 11, 12, <...>)))

由于 我认为 后一个SQL查询不能像第一个那样“工作”, 因此我如何使用Arel (或者可能是其他方式) 来生成SQL查询作为第一个?

更新(评论后)

给定“工作”上方的SQL查询相同,但我仍然想生成与问题中的第一个完全相同的SQL查询(这样做的主要原因是,第一个SQL查询比第二个更易读一个使用较少并使用“显式”括号),如何使用Arel做到这一点?


问题答案:

我已经成功使用了以下宝石:Arel顶部的squeel,因此您不必弄乱它。因此,为了生成查询,您可以在Squeel中执行以下操作:

@articles = Article.
  where{
  ( user_id.eq(1) | status.eq('published') ) |
  ( user_id.in([10, 11, 12, '<...>']) & status.eq('temp') )
}

# since this is an ActiveRecord::Relation we can play around with it
@articles = @articles.html" target="_blank">select{ [ user_id, status ] }

# and you can also inspect your SQL to see what is going to come out
puts @articles.to_sql

查询越复杂,得到的宝石就越多。



 类似资料:
  • 问题内容: 我有这样的查询- 由于将rowz = 1放入查询中,因此该查询无法正常工作?如果我只想要在嵌套后rowz = 1的结果该怎么办。 当我这样做时- 从news_article中选择unnest(string_to_array(na.news_category_id,’,’)):: int rowz; 我的桌子是- 然后它给了我这个结果- 问题答案: 这回答了您的问题: 诀窍是将数组放入一

  • 文档说过滤后的查询是 在2.0.0-beta1中不推荐使用。使用bool查询,查询使用must子句,筛选器使用filter子句。 来源 这是对filter子句的正确使用吗? 查询是,筛选器是

  • 问题内容: 我有以下SQL语句: 我读过我可以使用括号来完成此操作,但我想知道这是否有效: 或者 问题答案: 这两个都是有效的,但是由于优先级高于,因此它们的含义有所不同: 您的第一个带括号的查询将选择类型为3、4、5的已删除行 第二个带括号的查询将选择类型为3、5的所有行,以及类型为4的已删除行。这与不带括号的原始查询的含义相同。 您可以使用operator完全避免混淆,如下所示: 或者如果您想

  • 问题内容: 基本上,我试图从基于两个不同组的SQL中获取数据,必须相等并且必须相等,但是至于我想要同时获得和,这是我尝试的无济于事。 我很确定他们的方法可以使此查询正常工作,只是不在我脑海 问题答案: 具有比更高的优先级,因此您现有的表达式当前被评估为: 要强制使用替代逻辑,需要包括显式括号: 但是,在这种情况下,可以使用MySQL的运算符代替:

  • 问题内容: 我有这个查询: 哪个不会返回正确的结果。但是,在“或”条件周围加上括号可使其工作如下: 我的问题是为什么与众不同?我知道这是在考虑不带括号的OR语句;但我不知道它有什么不同。 我尚未找到任何对此有所帮助的文档。如果有任何链接,我将非常感谢。 问题答案: 这是因为OR的 运算符优先级 低于AND。每当DB看到类似 首先评估AND,即等于 因此,如果您明确想要 相反,您必须在括号中加上括号

  • 问题内容: 我怎么说 对于更复杂的查询,我应该使用原始SQL吗? 问题答案: 利用参数分组(Laravel4.2)。以您的示例为例: