Есть ли способ сравнить список значений с таблицей SQLite? - PullRequest
0 голосов
/ 16 февраля 2019

Мне нужно это решение для моего приложения Android, которое использует библиотеку Room для сохранения данных.Мне нужно реализовать решение, при котором список значений строк передается пользователем, он сравнивается с данными в таблице и затем возвращается обратно как с сопоставленными, так и с несогласованными результатами.

Таким образом, в некотором смыслеЯ хочу, чтобы все строковые значения, заданные пользователем, возвращались обратно независимо от того, были ли они сопоставлены с табличными значениями или нет.Однако у сопоставленных значений будет больше данных из таблицы, а несоответствующие значения будут просто значениями.

Например, у меня есть таблица tasks, имеющая столбцы, а именно task_id, task_title, task_status.Эта таблица содержит следующие данные:

1, «Задача 1», «В процессе»

2, «Задача 2», «В ожидании»

3, 'Задача 3 ',' Завершено '

4,' Задача 4 ',' В процессе '

Теперь пользователь передает список значений, чтобы проверить, есть ли какие-либо данные, доступные для любого из этихили нет.Если есть совпадение, они хотели бы получить статус этой задачи.Этот список передается в виде String[] и может содержать любые значения и любое количество значений.Предположим, что строковый массив имеет следующий вид:

{'Task 2', 'Task 3', 'Task 5'}

Какой запрос потребуется для получения следующих результатов:

'Задача 2', «В ожидании»

«Задача 3», «Завершено»

«Задача 5», Недоступно (или любое другое или нет сообщения)

Итак, мне нужновсе значения передаются через строковый массив, возвращенный с данными против тех, которые были сопоставлены, и без данных (или сообщений) с теми, которые не совпадают.

То, что я уже пробовал, это запросы вследующая форма:

@Query("SELECT task_title, task_status FROM tasks WHERE task_title IN (:values)") LiveData<List<Task>> getTasks(String[] values);

Будет возвращено следующее, как показано в примере выше:

«Задание 2», «В ожидании»

'Задача 3 ',' Завершено '

Не возвращает непревзойденное значение «Задача 5», которое фактически требуется вернуть.

Любая помощь будет принята с благодарностью, спасибо!

1 Ответ

0 голосов
/ 16 февраля 2019

Не с прямой SELECT.Нет простого (читай: простого) способа сделать это в sqlite.:values является неизвестным для sqlite.Рассматривали ли вы добавление несопоставленных результатов к возвращаемому объекту на основе разницы между результатом sql и входными значениями?

Если установлено расширение JSON1 , вы можете попробовать что-то вроде этого:

SELECT value,  
CASE when t.task_status is null then "NOT FOUND" else t.task_status END status
FROM json_each(json_array(:values))
LEFT join tasks t on t.task_title = value

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...