Поиск по json полям

WHERE `jfield`->'$.price' = 5           // По полю первого уровня вложенности
WHERE `jfield`->'$.*.price' = 5         // По полю второго (и более?) уровня вложенности
WHERE `jfield`->'$.price' IS NULL       // Если поле в json отсутствует
WHERE `jfield`->'$.price' IS NOT NULL   // Если поле в json присутствует
WHERE `jfield`->'$[0].price' IS NOT NULL   // Поле price первый элемента массива, если поле в json массив
WHERE `jfield`->'$[*].price' IS NOT NULL   // Поле price любого (всех) элементов массива, если поле в json массив

Поиска внутри самого json


// Допустим в json-поле хранится массив такого вида (ИД свойства и его значение):
[{id:'1',value:'111'},{id:'2',value:'222'},{id:'3',value:'333'}]

// Надо получить значение свойства ИД=3:
SELECT JSON_UNQUOTE(JSON_EXTRACT(`extra_fields`,JSON_UNQUOTE(REPLACE(JSON_SEARCH(`extra_fields`, 'one', '3', NULL, '$[*].id'), '.id', '.value')))) FROM ...

Здесь вложенная функция JSON_SEARCH находит правильный путь (селектор) к id=3, далее id заменяется на value и получившийся селектор скармливается функции JSON_EXTRACT, которая работает подобно записи `jfield`->'$.price' . JSON_UNQUOTE необходима для удаления кавычек из результата. На основе этого можно сделать вычисляемое (виртуальное) поле и индексацию по нему (для ускорения поиска):

Индексация по виртуальному полю из json


// На основе предыдущего примера:
ALTER TABLE `#__items` ADD COLUMN `extra_field_5` varchar(128) COLLATE 'utf8mb4_unicode_ci'
  GENERATED ALWAYS as (JSON_UNQUOTE(JSON_EXTRACT(`extra_fields`,JSON_UNQUOTE(REPLACE(JSON_SEARCH(`extra_fields`, 'one', '5', NULL, '$[*].id'), '.id', '.value')))));

ALTER TABLE #__items ADD INDEX extra_field_5 (extra_field_5) USING BTREE;