Sequel gem中的MySQL按位运算符

时间:2017-09-19 08:02:56

标签: mysql ruby sequel

我正在尝试使用Sequel gem使用按位运算符,我想知道是否有本机支持的方法来执行此操作。 现在我能做的当然是

MySequelModel.where('bitcolumn & ?', '0001010')

然而,我正在做的是合并我生成的很多续集表达式,有点像这样:

sequel_query = queries.inject(Neutral) do |expression, a_hash|
  expression & generate_query_from(a_hash)
end
然后

generate_query_from(...)将始终返回续集表达式对象。现在,当可能的返回值也可能是"bitcolumn & '100010'"时,这当然不再有用了。

我尝试创建像Sequel.expr("bitcolumn & '10001'")Sequel.expr(:bit_column) & Sequel.expr(value)这样的续集表达式,但这两者都会导致续集::错误:无效的过滤器表达式,即使后者使用>等运营商。

更新: 有趣的是,实际上可以将Sequel表达式与查询字符串合并,但它不会创建"正确的"查询。而不是创建例如:

"SELECT * FROM `users` WHERE ((`bitcolumn` = '000001') AND bitcolumn & '000001')"

它创建:

"SELECT * FROM `users` WHERE ((`bitcolumn` = '000001') AND 'bitcolumn & \\'000001\\'')"

哪个不起作用。

但也许我的用法:Sequel.expr(bitcolumn: '000001') & "bitcolumn & '000001'"不正确,可以修复。 另外,如果我的第一个返回的查询是字符串:query_string & sequel_expression当然会失败。

更新2:

我现在发现http://sequel.jeremyevans.net/rdoc/files/doc/sql_rdoc.html#label-Bitwise+Mathematical+Operators+-28-26+-7C+-5E+-3C-3C+-3E-3E+-7E-29这似乎是最合适的事情,但正在做:

[54] pry(main)> exp = Sequel.expr(:bit_column).sql_number & 1
=> #<Sequel::SQL::NumericExpression @op=>:&, @args=>[#<Sequel::SQL::Identifier @value=>"bit_column">, 1]>
[55] pry(main)> User.where(exp).sql

也会导致错误

Sequel::Error: Invalid filter expression: #<Sequel::SQL::NumericExpression @op=>:&, @args=>[#<Sequel::SQL::Identifier @value=>"bit_column">, 1]>

1 个答案:

答案 0 :(得分:0)

好的,所以我设法通过使用Sequel.lit来实现这一点。 Sequel.lit("bit_column & 1") & Sequel.expr('bit_column' => 1)返回"SELECT * FROM 'users' WHERE (cars_owned & 20 AND ('device' = 8))",这是正确的查询并且有效。

我仍然确定使用正确的按位数学运算符是一种更好的方式,所以我要保持开放。