使用INSTR更新多行

fjaof16o  于 2022-10-04  发布在  Swift
关注(0)|答案(1)|浏览(137)

我正在试着打以下电话:

UPDATE MyTable SET path = ? WHERE instr(title, ?) AND start - ? < 60

然而,我还不能将instr与GRDB一起使用。

_ = try dbQueue?.write { db in
    try MyTable
        .filter(Column("start") > date - 60)
        .filter(title.contains(Column("title")))
        .updateAll(db,
                   Column("path").set(to: path)
        )
}

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

nhaq1z21

nhaq1z211#

GRDB没有提供对instr函数的内置支持。您可以在代码中定义它:

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

请参阅How do I Print a Requestas SQL?常见问题解答,以控制GRDB生成的SQL。

相关问题