SQLite.Swift "not null" 表单的 Expression() 初始化?

SQLite.Swift Expression() initialization for "not null" form?

请注意,此问题仅与流行的 SQLite.swift 库有关,stephencelis/SQLite。swift

有了SQLite.swift你就可以

    let a = Expression<String>("a")
    let b = Expression<String>("b")

等等。但是你怎么

select a.x, a.y, ifnull(b.q, 'default text'), a.z
from a
left join b on blah

如何为内联 sql ifnull 子句创建表达式?

(doco 提到 Expression 有一个 init(literal:) 初始化器——也许它是相关的——但它没有记录并且有不寻常的绑定参数。)

请注意,我完全知道您可以将该值设为可选

  let q = Expression<String?>("q")

然后稍后输入默认值即可;

我在问如何将 "ifnull(b.q, 'default text')" 表达为表达式(或者,学习它是不可能的),以便在 SQL 表达式中实际使用该值。

再一次,这个问题只与图书馆有关 /stephencelis/SQLite.swift

我不喜欢回答我自己的问题,

但老实说,这里的现实答案是:

如今您必须像其他人一样使用 GRDB,github.com/groue/GRDB.swift

较旧的 SQL-wrapper 库(在当时是宏伟、令人敬畏、令人难以置信的)老实说只是

  • 现在完全过时了,技术方面
  • 不再真实地保持真实

截至 2017 年底,GRDB 是唯一真正的可能性。

也许这为时已晚,但无论如何。我查了源码,有函数

public func ??<V : Value>(optional: Expression<V?>, defaultValue: V) -> Expression<V> {
    return "ifnull".wrap([optional, defaultValue])
}

因此您必须将值设置为可选值

row.get(Expression<Double?>("q")) ?? 0 //this will be equals ifnull(q, 0)