Есть ли метод SQLite для Swift для более сложных операторов ORDER BY?

У меня есть запрос, подобный следующему, который я хотел бы выполнить в базе данных sqlite:

SELECT name 
FROM table 
WHERE name LIKE "%John%" 
ORDER BY (CASE WHEN name = "John" THEN 1 WHEN name LIKE "John%" THEN 2 ELSE 3 END),name LIMIT 10

Я хотел бы использовать SQLite для Swift, чтобы связать запрос вместе, но я в тупике относительно того, как (или если это вообще возможно) использовать метод .order.

let name = "John"
let filter = "%" + name + "%"
table.select(nameCOL).filter(nameCOL.like(filter)).order(nameCOL)

Получает меня

SELECT name
FROM table 
WHERE name LIKE %John% 
ORDER BY name

Любые идеи о том, как добавить в запрос, чтобы получить более сложную сортировку, где имена, начинающиеся с Джона, идут первыми, а затем имена с Джоном в них?

Я видел sqlite-часть решения здесь: SQLite LIKE & ORDER BY Match query

Теперь я просто хотел бы реализовать это с помощью SQlite для Swift.

Кажется, это может быть слишком ограничительным для этого, учитывая ограниченные примеры, у кого-нибудь еще есть опыт работы с более сложными предложениями ORDER BY?

Большое спасибо.


person BLE    schedule 31.01.2020    source источник
comment
Я не знаю, какой фреймворк вы используете, но вы не можете вместо этого отправить запрос как необработанный sql?   -  person Joakim Danielson    schedule 01.02.2020
comment
sqlite.swift github.com/stephencelis/SQLite.swift. Я думаю, что мог бы, но кажется наименее элегантным решением, учитывая цепной характер методов. Однако, спасибо. Отредактировано, чтобы добавить тег для sqlite.swift.   -  person BLE    schedule 03.02.2020


Ответы (1)


Sqlite.swift может довольно легко справиться с этим с помощью двух операторов .order:

let name = "John"
let filter = "%" + name + "%"
table.select(nameCol).filter(nameCol.like(filter))
.order(nameCol.like("\(name)%").desc
.order(nameCol)

Операторы .order применяются в том порядке, в котором они перечислены, причем первый из них является основным.

Фильтр уменьшит результаты только до тех, в которых есть «Джон». SQlite.swift может делать много сложных вещей. Я думал, что мне понадобится много необработанных sql-запросов, когда я перенес на него сотни сложных запросов, но мне еще предстоит использовать необработанный sql.

person HalR    schedule 17.03.2020