Sqlite.Swift: как фильтровать нулевые столбцы?

В моем предыдущем вопросе: Как создать фильтр, который выполняет SQL-эквивалент WHERE ... IN для SQLite.Swift

Я спросил, как сделать WHERE...IN в Swift.

Теперь, как мне отфильтровать необязательные выражения?

У меня есть версионная база данных, которая позволяет мне добавлять столбцы в таблицы после ее создания. И для этого я создал столбец с

static let timeTag = Expression<String?>("timeTag")

а потом позвонил

try DB.run("PRAGMA user_version = 2")
let query = table.addColumn(timeTag)
let _ = try DB.run(query)

все это работает, и в таблице действительно есть этот столбец, и я могу добавить данные в столбец и т. д.

обычно, когда мне нужно фильтровать в других столбцах, я делаю

table.filter(self.id == id && self.name == name)

и когда мне нужно сделать, где в,

table.filter((myNameArray.contains(self.name))

теперь я хочу отфильтровать столбец timeTag с помощью массива timeTagArray, который представляет собой массив требуемых timeTags для поиска. Я старался

table.filter(timeTagArray.contains(self.timeTag))

и пример таблицы:

+----+-------+-----------+
| id | name  | timetag   |
+----+-------+-----------+
| 1  | Joe   | Morning   |
+----+-------+-----------+
| 2  | Alan  | Afternoon |
+----+-------+-----------+
| 3  | Brad  | Morning   |
+----+-------+-----------+
| 4  | Ian   | Evening   |
+----+-------+-----------+
| 5  | Louis | Midnight  |
+----+-------+-----------+

если мой timeTagArray = ["Morning", "Midnight"], то я должен вернуть строки 1, 3, 5.

но это дает мне ошибку, которая говорит Cannot assign value of type 'Expression<Bool?>' (aka 'Expression<Optional<Bool>>') to type 'Expression<Bool>'


person stephw    schedule 07.06.2016    source источник
comment
Он говорит вам, что один из ваших параметров является необязательным. Bool? и Bool не равны. Вам просто нужно развернуть необязательный элемент (но я не вижу, где происходит фактическое сравнение).   -  person DJohnson    schedule 07.06.2016
comment
Я знаю это, но это Expression, и я не уверен, как это работает... Я полагаю, что ошибка возникает из-за части timeTagArray.contains(self.timeTag), поскольку self.timeTag является Expression<String?>, и поэтому выполнение содержимого дает Expression<Bool?>, который нельзя использовать в функции .filter   -  person stephw    schedule 07.06.2016
comment
Взгляните на интерфейс запросов GRDB github.com/groue/GRDB.swift#the -запрос-интерфейс . Вы бы тоже написали filter(timeTagArray.contains(self.timeTag)), но на этот раз без ошибок.   -  person Gwendal Roué    schedule 08.06.2016
comment
Но я использую SQLite.swift. Я бы перешел на GRDB только в том случае, если нет абсолютно никаких других альтернатив, так как на данный момент это будет слишком много проблем.   -  person stephw    schedule 08.06.2016
comment
@apikurious Конечно, ты прав :-) В следующий раз, может быть, у тебя будет еще меньше проблем.   -  person Gwendal Roué    schedule 08.06.2016
comment
@apikurious Используете ли вы последнюю версию SQLite.swift? [String].contains должен взять Expression<Bool?>. Я проверил следующее на игровой площадке, и, похоже, это сработало: let timeTag = Expression<String?>("timeTag"); let table = Table("table"); let timeTagArray = ["Morning", "Midnight"]; table.filter(timeTagArray.contains(timeTag))   -  person stephencelis    schedule 09.06.2016