Короче говоря: я использую MySQL 5.6 (на данный момент невозможно обновить до более новой версии и использовать улучшенные возможности JSON), и у меня есть столбец, в котором хранится JSON.
Примеры объектов JSON, хранящихся в базе данных:
-- Row #1 (`options` column) {"name": "Test", "description": "Some description", "type": "post", "scheduled": true, "deleted": false, "timestamp": "1482263883"} -- Row #2 (`options` column) {"name": "", "description": "Some description test", "type": "post", "scheduled": true, "deleted": false, "timestamp": "1482263883"}
Проблема: я хочу, чтобы иметь возможность выполнять поиск по записям в отношении свойства name
хранящегося в моем объекте JSON.
SELECT * FROM `my_table` WHERE ((`options` LIKE '%"name":"%Test%"%'))
Вышеприведенный запрос работает отлично, но иногда он может возвращать ложные срабатывания (например, будет возвращена вторая строка, а также содержит строку «test» в свойстве description
).
Некоторые примечания:
options
точно такой же для каждой строки, например, свойство name
расположено в первой позиции для каждой записи. Вы можете использовать регулярное выражение вместо LIKE
. Это позволяет использовать шаблон, который не будет пересекать границы строк, в отличие от шаблона %
в LIKE
SELECT * FROM my_table WHERE options REGEXP '"name": *"[^"]*Test'
Однако вместо полученного ложного значения это может привести к ложному отрицанию, если строка содержит:
"name": "This is a \"quoted\" Test"
потому что [^"]*
не будет пропускать скрытые кавычки.
Возможно, есть какой-то способ уточнить регулярное выражение, чтобы это сделать, но это будет непросто.