【发布时间】:2014-05-12 15:21:34
【问题描述】:
这是一个例子(没有意义,但作为一个例子很好)
t = DimensionType.arel_table
q = t.where(
t[:label].eq('a').and(t[:label].eq('b'))
.or(t[:label].eq('c').and(t[:label].eq('d')))
.or(t[:label].eq('e').and(t[:label].eq('f')))
.or(t[:label].eq('g').and(t[:label].eq('e')))
).to_sql
puts q
这是输出:
SELECT FROM "dimension_types" WHERE ((("dimension_types"."label" = 'a' AND "dimension_types"."label" = 'b' OR "dimension_types"."label" = 'c' AND "dimension_types"."label" = 'd') OR "dimension_types"."label" = 'e' AND "dimension_types"."label" = 'f') OR "dimension_types"."label" = 'g' AND "dimension_types"."label" = 'e')
括号有什么作用?如果没有,如何避免拥有它们?他们将 where 部分置于一种可能会影响查询优化的层次结构中。
编辑: 目的是进行这样的查询(使用人为的元语言):
(a and b) or (b and c) or (d and e)
没有括号也一样,因为and 优先于or
a and b or b and c or d and e
如果我错了,请纠正我。
【问题讨论】:
-
括号改变了布尔运算符的优先顺序,并将逻辑组合在一起。没有它们,含义完全不同(基于从左到右的阅读顺序和 AND/OR 的相对优先级)。简单来说,没有括号
AND总是在OR之前评估。
标签: sql ruby-on-rails ruby ruby-on-rails-4 arel