You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 07:00:08