我在程序中使用 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)
您可以使用按位 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 '\')))