Запрос MySQL для поиска поля со строкой JSON

это может быть достаточно просто с базовым SQL или может потребоваться регулярное выражение, но я попал в кирпичную стену.

мои данные хранятся в строке JSON, как эти два примера (каждый в 1 поле):

[{"id":"2","value":["1","3"]},{"id":"3","value":["1","2"]}]

и:

[{"id":"3","value":["2"]},{"id":"3","value":["1","2","5"]}]

Я хочу искать значения между этими последними скобками, которые могут состоять из многих чисел ["1","2","5"] or just a single on ["2"]. Начальные номера соответствуют 2 категориям-одиночным "id":"2" и "id":"3".

используя %"2"% С простым Как будто, конечно, все совпадает. Я могу запросить по "id":"$var" чтобы вернуть каждую категорию, затем используйте PHP для фильтрации после получения результатов, но данные могут быть довольно большими, и я уверен, что это легко для гуру SQL.

у меня нет возможности изменить формат поля, он должен оставаться как JSON.

любая помощь приветствуется! Спасибо.

2 ответов


Я думаю, что решил его, используя это:AND extra_fields REGEXP '(.*"id":"2".*)("\[.*"1".*\]")'. Это больше связано с регулярными выражениями, чем с MySQL :P

комментировать: (я не смог найти кнопку "комментарий")
Этот синтаксис становится яснее, когда вы узнаете, что "extra_fields" - это имя столбца в таблице


в SQL это очень просто, потому что вам нужно только определить последнюю открывающую скобку. Это можно сделать с помощью индекса подстроки.

возможно, ваша таблица называется test, а ваше поле со строкой text - это должно работать

select text from (select substring_index(text,'[',-1) as text from test) as new where text like '%5%'**

Если у вас есть текст между 2 уникальными разделителями, возможно, вы найдете в этом уроке полезны