#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