使用MySQL 5.6搜索JSON对象中的属性

时间:2016-12-20 20:12:27

标签: php mysql sql json

长话短说:我正在使用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”字符串。

一些注意事项:

  1. options列中存储的对象对于每一行完全相同,例如name属性位于每条记录的第一个位置。

1 个答案:

答案 0 :(得分:3)

您可以使用正则表达式而不是LIKE。这允许您使用不会跨越字符串边界的模式,这与%

中的LIKE通配符不同
SELECT * FROM my_table
WHERE options REGEXP '"name": *"[^"]*Test'

但是,如果行包含:

,则可能会产生误报,而不是您得到的误报
"name": "This is a \"quoted\" Test"

因为[^"]*不会通过转义引号。

可能有某种方法可以优化正则表达式来实现这一点,但这并不简单。