2015-05-01 3 views
0

Я хотел бы выполнить довольно сложную инструкцию SQL, используя SQLite.swift, и получить результат предпочтительно в массиве, который будет использоваться в качестве источника данных для представления таблицы. Заявление выглядит следующим образом:Как выполнить сложный оператор sql и получить результаты в массиве?

SELECT defindex, AVG(price) FROM prices WHERE quality = 5 AND price_index != 0 GROUP BY defindex ORDER BY AVG(price) DESC 

Я изучал документацию SQLite.swift к Ind, как сделать это правильно, но я не мог найти способ. Я мог бы позвонить в базу данных и выполнить итерацию через объект Statement, но это было бы не оптимально.

Любая помощь будет оценена по достоинству.

+0

Я не обращался к «производительности» аспект, потому что я не знаю, какую производительность вопросов, которые вы видели. – stephencelis

+0

Я не знал, что вы можете сделать заявление в массив, поэтому я подумал, что вам нужно итерации для создания массива (так как в вашем примере есть цикл). Спасибо! – Longi

ответ

7

Большинство последовательностей в Swift может быть распакованы в массив, просто обернув саму последовательность в массиве:

let stmt = db.prepare(
    "SELECT defindex, AVG(price) FROM prices " + 
    "WHERE quality = 5 AND price_index != 0 " + 
    "GROUP BY defindex " + 
    "ORDER BY AVG(price) DESC" 
) 
let rows = Array(stmt) 

Создание источника данных из этого должно быть относительно простым в этой точке.

Если вы используете типобезопасный API, это будет выглядеть следующим образом:

let query = prices.select(defindex, average(price)) 
        .filter(quality == 5 && price_index != 0) 
        .group(defindex) 
        .order(average(price).desc) 
let rows = Array(query) 
+0

Что делать, если у меня есть несколько фильтров, например, размер и цвет, что если для цвета столбца у меня есть следующие параметры (все, синий, черный и желтый), а в db цвет столбца только синий и желтый. Как создать динамический фильтр? – danielsalare

+0

@edse Вы можете создать и удержать ссылку на «базовый» запрос и применить соответствующий фильтр при его изменении. Я бы опубликовал образец кода, но он не форматируется в комментариях. Не стесняйтесь открывать новый вопрос, хотя, если вам все еще нужна помощь. – stephencelis