长话短说:我正在使用MySQL 5.6(目前,无法更新到更新的版本并使用改进的JSON功能),而且我有一个存储JSON的列。< / p>
存储在数据库中的示例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
属性位于每条记录的第一个位置。答案 0 :(得分:3)
您可以使用正则表达式而不是LIKE
。这允许您使用不会跨越字符串边界的模式,这与%
LIKE
通配符不同
SELECT * FROM my_table
WHERE options REGEXP '"name": *"[^"]*Test'
但是,如果行包含:
,则可能会产生误报,而不是您得到的误报"name": "This is a \"quoted\" Test"
因为[^"]*
不会通过转义引号。
可能有某种方法可以优化正则表达式来实现这一点,但这并不简单。