长话短说:我正在使用 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"}
问题:我希望能够根据存储在我的 JSON 对象中的 name
属性搜索记录。
SELECT * FROM `my_table` WHERE ((`options` LIKE '%"name":"%Test%"%'))
上面的查询工作正常,但有时它可能会返回误报(例如,将返回第二行,并且它在 description
属性中包含“test”字符串)。
一些注意事项:
options
列中存储的对象对于每一行都完全相同,例如name
属性位于每条记录的第一位。
最佳答案
您可以使用正则表达式代替 LIKE
。这允许您使用不会跨越字符串边界的模式,这与 LIKE
%
通配符不同
SELECT * FROM my_table
WHERE options REGEXP '"name": *"[^"]*Test'
但是,如果一行包含以下内容,这可能会产生误报,而不是您得到的误报:
"name": "This is a \"quoted\" Test"
因为 [^"]*
不会遍历转义引号。
可能有一些方法可以改进正则表达式以允许这样做,但这并不简单。
关于php - 使用 MySQL 5.6 在 JSON 对象中搜索属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41250528/