SQLite.Swift Expression()初始化为“not null”形式?

时间:2017-04-27 12:15:40

标签: sqlite.swift

请注意,这个问题仅涉及流行的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

有关

2 个答案:

答案 0 :(得分:1)

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

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

现在你必须像其他人一样使用GRDB,github.com / groue / GRDB.swift

旧的SQL包装程序库(如同当时一样华丽,令人敬畏,令人难以置信)诚实地只是

  • 现在完全过时,技术明智
  • 不诚实地维持现实

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

答案 1 :(得分:1)

也许这太晚了,但无论如何。我检查了源代码,有功能

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)