mysql JSON найти по элементу в массиве

разбираюсь сейчас с одной задачей, нужно найти GUID по номеру телефона, который в массиве в объекте JSON, и впринципе как-бы он находит... но мне не очень то и нравится.

Есть JSON массив phones в таблице phonebook

[{"phone": "8800***3535", "comment": "Какой-то комментарий"}, {"phone": "895***59900", "comment": "Какой-то комментарий"}]

и в этой же строке есть поле guid

Нужно вывести GUID который принадлежит. Но нужно по любому из элементов массива, грубо говоря найти "чёрт побери" кому номер относится

Вот такой код у меня работает, но я понимаю что он не правильный,

SELECT guid FROM phonebook WHERE JSON_CONTAINS(phonebook.phones, '{"phone":"8800***3535"}')

кто мастера JSON подскажите!)

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


Ответы (2 шт):

Автор решения: Dmitry

Костыль, конечно, но всё же.

SELECT `guid` FROM `phonebook` WHERE `phones` LIKE '%"8800***3535"%'

В выражении %"8800***3535"% процент будет означать любое количество (включая 0) любых символов. В представленном конкретном случае поиск строки будет происходить по правилам:

  • Любые символы до необходимого выражения
  • Необходимое выражение – "8800***3535"
  • Любые символы после необходимого выражения

Если проще говоря, данный способ не будет декодировать JSON и выбирать конкретный параметр, а просто будет сравнивать строку с шаблоном: любые символы + кавычка + необходимый номер + кавычка + любые символы.

Можно немного отредактировать, чтоб искался шаблон "phone": "8800***3535".

SELECT `guid` FROM `phonebook` WHERE `phones` LIKE '%"phone": "8800***3535"%'
→ Ссылка
Автор решения: Ruslan Melnichenko

Вы можете использовать функцию JSON_SEARCH (wiki). Эта функция доступна с MySQL 5.7

Вот решение:

SELECT `guid` FROM `phonebook` WHERE JSON_SEARCH(`phones`, 'one', '8800***3535', NULL, '$[*].phone') IS NOT NULL
→ Ссылка