我正在尝试使用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]>
答案 0 :(得分:0)
好的,所以我设法通过使用Sequel.lit来实现这一点。
Sequel.lit("bit_column & 1") & Sequel.expr('bit_column' => 1)
返回"SELECT * FROM 'users' WHERE (cars_owned & 20 AND ('device' = 8))"
,这是正确的查询并且有效。
我仍然确定使用正确的按位数学运算符是一种更好的方式,所以我要保持开放。