Запросите массив JSON для нескольких значений, используя json1 в sqlite - PullRequest
1 голос
/ 11 апреля 2019

Я пытаюсь использовать расширение json1 для запроса к моей базе данных sqlite и хочу запросить массив json для совпадения нескольких значений и вернуть запись, которая соответствует всем значениям.

Примеры объектов:

Сущность 1:

{
    EntityID: 123,
    tags: [tag1, tag2, tag3]
}

Сущность 2:

{
    EntityID: 234,
    tags: [tag2, tag3]
}

В этом примере я хочу запросить теги, которые соответствуют нескольким значениям.Если мой ввод [tag1, tag2], то я хочу вернуть только Entity 1, тогда как если мой ввод tag2, тогда я хочу вернуть оба объекта.

Запрос, который я ожидал обработать, был

SELECT * 
FROM entities, json_each(tags) 
WHERE json_each.value IS "tag1" 
    AND json_each.value IS "tag2"

Но этот запрос не выполняется во всех случаях.Что касается того, почему это не удается, я думаю, что он пытается сопоставить каждое значение массива с tag1 и tag2, что не так, поскольку каждый элемент имеет только 1 значение.Это допустимо или есть другое объяснение?

Запрос, который сработал для меня в очень конкретном случае проверки [tag1, tag2] значений и возврата только Entity 1, равен

SELECT * 
FROM entities, json_each(tags) 
WHERE json_each.value IS "tag1" OR "tag2"

Я хочу знать, почему это работает в случае выше?Единственное, о чем я могу думать, это то, что он проверяет каждое значение массива на tag1 или tag2, но я не понимаю, почему он возвращает Entity 1, который также имеет значение tag3 и делаетне соответствует критериям.Однако в этом случае происходит сбой в большинстве других случаев, например, когда я ищу [tag3, tag4], он возвращает обе сущности в этом случае, но не должен возвращать ни одной.Так что это определенно не ответ

Я до сих пор не смог найти правильный способ эффективного запроса и ищу какие-либо предложения.

В идеале, если есть еще более простой способзапросите это тогда, что будет высоко ценится.Я имею в виду что-то, где я даю запросу список значений для тегов, и он соответствует всем им, без необходимости использования AND / OR операторов

1 Ответ

0 голосов
/ 11 апреля 2019

Первый запрос сначала выбирает tag1, сравнивает его с tag1 и tag2, завершается неудачей, а затем выбирает другое значение. Это сбой, потому что значение не может быть tag1 и tag2 одновременно.

Я бы предложил использовать вложенные запросы, заменив предложение from другим запросом

...