我有一个MySQL(v5.7)数据库,其中有一个名为deals的表,其中包含一个名为status的JSON列。
Status包含以下格式的数据(deals id=29)(对格式表示歉意):
{
"trackStatus":
[
{
"date":[],
"notes":[],
"value":"0",
"isChecked":false
},
{
"date":["2019-03-25T17:42:45-04:00"],
"notes":[],
"value":4,
"isChecked":true
}
],
"nextStatusIndex":0,
"currentDealStatus":4
}
我试图查询
trackStatus
数组,其中value
=4to find out if it
被检查。通过阅读MySQL引用,我了解到需要使用
JSON_EXTRACT
函数来获取数据。在下面的一些示例中,我按如下方式测试了查询,以查看是否可以返回
trackStatus
:SELECT JSON_EXTRACT(status, '$.trackStatus')
FROM deals
WHERE deals.id = 29
这样可以工作并返回
trackStatus
。但是,当我尝试在trackStatus
中展开此项以查询特定于isChecked
的值时,它不会返回值(不是空值,而是空值)。SELECT JSON_EXTRACT(status, '$.trackStatus', '$.isChecked')
FROM deals
WHERE deals.id = 29 AND JSON_EXTRACT(status, '$.trackStatus', '$.value') = 4
我试过无数种不同的问题,直到我绕圈子的时候。
我意识到问题出在
trackStatus
上,因为如果删除该数组,我可以查询nextStatusIndex
并且它可以工作。但是如果数组在那里,它就不会。因此,我希望有人能告诉我如何/如果我可以使用MySQL查询(在
trackStatus
和nextStatusIndex
中)来查询这个JSON,给出数据的格式。 最佳答案
在MySQL 8.0中,可以将内部JSON数组转换为function JSON_TABLE()
的记录集,然后对其进行检查。
下面是5.7版的解决方案,它依赖于JSON_SEARCH()
and JSON_EXTRACT()
。
此查询将为isChecked
数组中属性trackStatus
设置为value
的(第一个)元素提供attribute4
的值:
SELECT JSON_EXTRACT(
status,
REPLACE(
REPLACE(
JSON_SEARCH(status, 'all', '4', '', '$.trackStatus[*].value'),
'"', ''),
'.value', '.isChecked')
) isCheckedAtValue4
FROM deals WHERE deals.id = 29;
如果样本数据位于this DB fiddle中,则返回:
| isCheckedAtValue4 |
| ----------------- |
| true |
细节
您可以使用
JSON_SEARCH
查找数组trackStatus
中属性设置为value
的(第一个)元素的路径:SELECT JSON_SEARCH(status, 'one', '4', '', '$.trackStatus[*].value')
FROM deals
WHERE deals.id = 29;
对于测试数据,这通常会返回:
4
。我们可以操纵路径字符串,将其指向同一数组元素的属性
"$.trackStatus[1].value"
。周围的双引号也需要删除:SELECT REPLACE(
REPLACE(
JSON_SEARCH(status, 'one', '4', '', '$.trackStatus[*].value'),
'"', ''),
'.value', '.isChecked'),
FROM deals WHERE deals.id = 29;
返回:
isChecked
。最后,这个表达式可以作为
$.trackStatus[1].isChecked
的参数。