如何在Ruby的Sequel中结合Sequel.or与Sequel.like?(适配MSSQL/SQLite)
使用Sequel构建带OR条件的DELETE语句(MSSQL环境)
我用Ruby结合Sequel框架,想要执行如下数据库删除操作:
DELETE FROM db.tbl WHERE col1 = 'a' and (col2 LIKE '%xxx%' OR col2 LIKE '%yyy%')
尝试用Sequel.or结合Sequel.like构建语句时,出现错误:
DB[:tbl].filter(col1: 'a').filter( Sequel.or([Sequel.like(:col2, '%xxx%'),Sequel.like(:col2, '%yyy%')]) ).delete
错误信息:in ``or': must pass a conditions specifier to Sequel.or (Sequel::Error)
另外在MSSQL环境下,无法使用正则表达式的写法:
DB[:tbl].filter(col1: 'a').filter(Sequel.like(:col2, /xxx|yyy/)).delete
分开执行两条语句可以实现需求,但我希望用OR逻辑合并,方便后续添加更多匹配值:
DB[:tbl].filter(col1: 'a').filter(Sequel.like(:col2, '%xxx%')).delete DB[:tbl].filter(col1: 'a').filter(Sequel.like(:col2, '%yyy%')).delete
正确解法
Sequel.or的参数格式有误,需要传入多个条件参数或哈希数组,以下是几种可行写法:
写法1:直接传入多个Sequel.like条件给Sequel.or
DB[:tbl].filter(col1: 'a').filter( Sequel.or( Sequel.like(:col2, '%xxx%'), Sequel.like(:col2, '%yyy%') ) ).delete
写法2:使用哈希数组格式
DB[:tbl].filter(col1: 'a').filter( Sequel.or([ {col2: Sequel.like('%xxx%')}, {col2: Sequel.like('%yyy%')} ]) ).delete
写法3:动态批量匹配(推荐用于后续扩展)
把需要匹配的关键词放到数组里,动态生成OR条件,方便后续添加更多值:
keywords = ['xxx', 'yyy'] # 可随时添加新关键词 DB[:tbl].filter(col1: 'a').filter( Sequel.or(keywords.map { |kw| Sequel.like(:col2, "%#{kw}%") }) ).delete
修改后的完整可运行示例
require 'sequel' Sequel.extension :pretty_table DB = Sequel.sqlite DB.create_table(:tbl){ primary_key :id field :col1, :type => :nvarchar, :size => 10 field :col2, :type => :nvarchar, :size => 10 } DB[:tbl].insert(:col1 => 'a', :col2 => 'axxx1') DB[:tbl].insert(:col1 => 'a', :col2 => 'a2') DB[:tbl].insert(:col1 => 'a', :col2 => 'ayyy3') DB[:tbl].insert(:col1 => 'b', :col2 => 'bxxx1') DB[:tbl].insert(:col1 => 'b', :col2 => 'b2') DB[:tbl].insert(:col1 => 'b', :col2 => 'byyy3') # 执行带OR条件的删除 keywords = ['xxx', 'yyy'] DB[:tbl].filter(col1: 'a').filter( Sequel.or(keywords.map { |kw| Sequel.like(:col2, "%#{kw}%") }) ).delete # 打印剩余数据验证结果 sel = DB[:tbl] Sequel::PrettyTable.print(sel, sel.columns)
内容的提问来源于stack exchange,提问作者knut
相关产品推荐
相关产品推荐

