Запрос по списку JSON в Mysql 5.6

0

Я использую mysql 5.6, и мне не представляется возможным обновить его до 5.7. У меня есть таблица, в которой json используется как атрибут. Прикрепление скриншота для справки.

Изображение 174551

Здесь столбец policy_status содержит статус и значения различных политик как json для каждого пользователя. Как я могу найти список пользователей, скажем, с состоянием успеха appVersion и значением = 1437. Я получил несколько ссылок в Интернете, но поскольку я новичок в хранимых процедурах, я не могу найти решение. Буду признателен за любую помощь. Заранее спасибо.

Теги:

1 ответ

1
Лучший ответ

Это неэффективно, но может помочь вам в идеях:

SELECT *
FROM data
WHERE
  (LOCATE('"employmentType":["status":"success"]', policy_status) > 0
   AND
   LOCATE('"value": 1', policy_status) > 0);

Используя функцию LOCATE вы можете увидеть, содержит ли поле требуемые строки appVersion и value. См. Демо-версию sqlfiddle.

Где простые тестовые данные:

CREATE TABLE data (
  id INT UNSIGNED NOT NULL,
  policy_status TEXT
);

INSERT INTO data (id, policy_status) VALUES
(1,'{"employmentType":["status":"success"], "value": 1}'),
(2,'{"employmentType":["status":"no"], "value": 1}'),
(3,'{"employmentType":["status":"no"], "value": 0}'),
(4,'{"employmentType":["status":"success"], "value": 0}'),
(5,'{"employmentType":["status":"no"], "value": 1}');

дает результат:

{"employmentType":["status":"success"], "value": 1}

Там, где найдены две строки.

ОБНОВЛЕНИЕ:

Также, если вы можете добавить индекс FULLTEXT для своего столбца policy_status вы можете использовать полнотекстовый поиск в WHERE:

...
WHERE
   MATCH (policy_status) AGAINST ('+"employmentType:[status:success]" +"value: 1"' IN BOOLEAN MODE)

Обратите внимание на символы + и " в AGAINST(...). Это специальные логические операторы полнотекстового поиска. См. Здесь.

Значок ведущего или конечного плюса указывает, что это слово должно присутствовать в каждой строке, которая возвращается

а также

Фраза, заключенная в символы двойной кавычки ("), соответствует только строкам, которые содержат фразу буквально, по мере ее ввода. Полнотекстовый механизм разбивает фразу на слова и выполняет поиск в индексе FULLTEXT для слов. не нужно точно соответствовать.

Если это не вариант в вашем случае, вы можете использовать LIKE для соответствия подстрок:

...
WHERE
  (policy_status LIKE '%"employmentType":["status":"success"]%'
   AND
   policy_status LIKE '%"value": 1%');

См. Демоверсию sqlfiddle для обоих.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню