Инициализация SQLite.Swift Expression() для не нулевой формы?

Обратите внимание, что этот вопрос относится ТОЛЬКО к популярной библиотеке 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?

(В документации упоминается, что в Expression есть инициализатор init(literal:) — возможно, это важно, — но он недокументирован и имеет необычные аргументы привязки.)

Обратите внимание, я полностью осознаю, что вы можете сделать значение необязательным

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

а затем просто установите значение по умолчанию позже;

Я спрашиваю, как выразить «ifnull (b.q, 'текст по умолчанию')» в виде выражения (или узнать, что это невозможно), чтобы это значение действительно использовалось в выражении SQL.

Еще раз повторюсь, этот вопрос относится только к библиотеке /stephencelis/SQLite.swift


person Fattie    schedule 27.04.2017    source источник
comment
Что ж, простой поиск ifnull в SQLite документация .swift что-то дает.   -  person Gwendal Roué    schedule 28.04.2017
comment
Привет, @GwendalRoué - спасибо, но на самом деле эта строка на странице документа совсем не объясняет, как и можно ли использовать сложное встроенное выражение выбора. (например, select ifnull(b.q, 'текст по умолчанию'), бла, бла...) К сожалению, я нигде не могу его найти - возможно, он просто не обрабатывается.   -  person Fattie    schedule 28.04.2017
comment
Так что я думаю, вам пришлось использовать необработанный SQL. В другом проекте вы можете попробовать GRDB.swift в качестве замены SQLite.swift. В построителе запросов GRDB тоже есть дыры, и он не может генерировать все SQL-запросы. Но, по крайней мере, вас не наказывают, когда вам приходится отступать к чистому SQL: потребление строк идентично.   -  person Gwendal Roué    schedule 29.04.2017
comment
Спасибо! Вы попробуете GRDB позже ;-)   -  person Gwendal Roué    schedule 29.04.2017


Ответы (2)


Я не люблю отвечать на свой вопрос,

но, честно говоря, реалистичный ответ здесь:

в настоящее время вы должны использовать GRDB, как и все остальные, github.com/groue/GRDB.swift

Старые библиотеки SQL-оболочек (какими бы великолепными, потрясающими, невероятными они ни были в то время), честно говоря, просто

  • полностью устарел сейчас, с точки зрения технологий
  • честно говоря, реально больше не поддерживается

По состоянию на конец 2017 года GRDB — единственная реальная возможность.

person Fattie    schedule 29.10.2017

Может быть, это слишком поздно, но тем не менее. Я проверил исходный код, есть функция

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)
person GuessWho    schedule 07.05.2018