首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用instr更新多行

使用instr更新多行
EN

Stack Overflow用户
提问于 2022-09-28 09:52:06
回答 2查看 110关注 0票数 0

我试着打以下电话:

代码语言:javascript
运行
复制
UPDATE MyTable SET path = ? WHERE instr(title, ?) AND start - ? < 60

但是,我还不能在GRDB中使用instr

代码语言:javascript
运行
复制
_ = try dbQueue?.write { db in
    try MyTable
        .filter(Column("start") > date - 60)
        .filter(title.contains(Column("title")))
        .updateAll(db,
                   Column("path").set(to: path)
        )
}

我怎么才能正确地做这件事?我也可以运行一个原始查询吗?如果使用原始查询,如何使用变量填充?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-09-29 10:27:46

GRDB不附带对instr函数的内置支持。您可以在代码中定义它:

代码语言:javascript
运行
复制
func instr(_ lhs: some SQLExpressible, rhs: some SQLExpressible) -> SQLExpression {
    SQL("INSTR(\(lhs), \(rhs))").sqlExpression
}

// SELECT * FROM myTable WHERE instr(?, title)
let title: String = ...
let request = MyTable.filter(instr(title, Column("title")))

// UPDATE myTable SET path = ? WHERE instr(?, title)
let path: String = ...
try request.updateAll(db, Column("path").set(to: path))

请参阅如何将请求打印为SQL?常见问题,以便控制GRDB生成的SQL。

票数 1
EN

Stack Overflow用户

发布于 2022-10-06 09:23:05

下面是我如何使用原始SQL来解决这个问题,以防它太复杂而无法扩展框架。我选择这样做,因为我认为对于那些需要阅读代码并且对GRDB或框架没有经验的人来说,这更容易理解。

代码语言:javascript
运行
复制
do {
  var dbQueue:DatabaseQueue? = try DatabaseQueue(path: "PATH_TO_DATABASE")
  try dbQueue?.write { db in
    try db.execute(
      sql: "UPDATE MyTable SET path = :path WHERE instr(title, :title)",
      arguments:  ["path": path, "title": title]
    )
  }
} catch {
  print("UPDATE MyTable \(error)")
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73879456

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档