如何将Sequel.or 与Sequel.like 结合起来? (mssql 或 sqlite)

问题描述 投票:0回答:1

我在程序中使用 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)

sequel 和 mssql 无法使用正则表达式。

DB[:tbl].filter(col1: 'a').filter(Sequel.like(:col2, /xxx|yyy')).delete

有效的方法是用两个语句来实现:

DB[:tbl].filter(col1: 'a').filter(Sequel.like(:col2, '%xxx%')).delete
DB[:tbl].filter(col1: 'a').filter(Sequel.like(:col2, '%yyy%')).delete

但我更喜欢使用

or
,我可能会得到额外的价值。

完整的 MWE:

require 'sequel'
Sequel.extension :pretty_table  #Sequel::PrettyTable.print()/Sequel::PrettyTable.string()

DB = Sequel.sqlite
DB.create_table(:tbl){
  primary_key :id
  field :col1, :type => :nvarchar, :size => 10
  field :col2, :type => :nvarchar, :size => 10
} #unless DB.table_exists?(:file)

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')

#Two statements without Sequel.or work
DB[:tbl].filter(col1: 'a').filter(Sequel.like(:col2, '%xxx%')).delete
DB[:tbl].filter(col1: 'a').filter(Sequel.like(:col2, '%yyy%')).delete

#Does not work
DB[:tbl].filter(col1: 'a').filter(
    Sequel.or([Sequel.like(:col2, '%xxx%'),Sequel.like(:col2, '%yyy%')])
    ).delete

sel = DB[:tbl]
Sequel::PrettyTable.print(sel, sel.columns)
ruby sql-like sequel
1个回答
0
投票

您可以使用按位 OR 运算符连接两个 LIKE 条件:

DB[:tbl].filter(col1: "a").filter(
  Sequel.like(:col2, "%xxx%") | Sequel.like(:col2, "%yyy%")
).delete

输出:

+--+----+-----+
|id|col1|col2 |
+--+----+-----+
| 2|a   |a2   |
| 4|b   |bxxx1|
| 5|b   |b2   |
| 6|b   |byyy3|
+--+----+-----+

这是 Sequel 执行的 SQL 查询(来自日志):

DELETE FROM `tbl` WHERE ((`col1` = 'a') AND ((`col2` LIKE '%xxx%' ESCAPE '\') OR (`col2` LIKE '%yyy%' ESCAPE '\')))
© www.soinside.com 2019 - 2024. All rights reserved.