MySQL JSON находит несколько значений

#mysql #arrays #json

Вопрос:

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

Мой Столик:

 CREATE TABLE test (id SERIAL, label VARCHAR(16), data VARCHAR(80));

INSERT INTO test VALUES
    (null, 'test 1', '["Monday", "Tuesday", "Friday"]'),
    (null, 'test 2', '["Thursday", "Friday"]'),
    (null, 'test 3', '["Sunday", "Saturday", "Monday"]');
 

Мой Вопрос:

 SELECT * FROM test
WHERE JSON_UNQUOTE(JSON_EXTRACT(data, '$[*]')) IN ('Monday', 'Tuesday');
 

Запрос должен был дать мне тест 1 и тест 2 в качестве результата.

Вот скрипка DB.

Ответ №1:

Вы можете использовать OR для этого

 SELECT * FROM test
where JSON_CONTAINS(data,'"Monday"')=1 or JSON_CONTAINS(data,'"Tuesday"')
 

Рабочая демонстрация

Если вы не хотите использовать OR ,то вы можете попробовать json-перекрытия, как показано ниже:

    SELECT * FROM test WHERE 
      JSON_OVERLAPS(data,'["Monday","Tuesday"]')=1
 

Но будьте осторожны, чтобы он поддерживал только начиная с MySQL 8.0.17

Комментарии:

1. Эти дни будут введены пользователем. Таким образом, мне нужно добавить ИЛИ динамически добавить в запрос. Есть еще какой-нибудь вариант?

2. @Omer для этого вы можете использовать json-перекрытия

3. json-перекрытия отображают только один результат. SELECT * FROM test WHERE JSON_CONTAINS(data,'["Monday","Tuesday"]')=1

4. это не работает на скрипке DB — db-fiddle.com/f/fC48mHEM1nuLUZCTP8CLfs/45

5. @Omer смотрите последнюю часть моего ответа, но будьте осторожны, чтобы он поддерживал только начиная с MySQL 8.0.17