Я использую mysql 5.6, и мне не представляется возможным обновить его до 5.7. У меня есть таблица, в которой json используется как атрибут. Прикрепление скриншота для справки.
Здесь столбец policy_status содержит статус и значения различных политик как json для каждого пользователя. Как я могу найти список пользователей, скажем, с состоянием успеха appVersion и значением = 1437. Я получил несколько ссылок в Интернете, но поскольку я новичок в хранимых процедурах, я не могу найти решение. Буду признателен за любую помощь. Заранее спасибо.
Это неэффективно, но может помочь вам в идеях:
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 для обоих.