在我的MySQL 8.0表中,我有一个JSON ARRAY列。它是JSON对象的数组。我想根据对象中的键值对从每一行的数组中选择一个对象。
示例行:
[{bool:false, number:0, value:'hello'},
{bool:true, number:1, value:'world'},
{bool:true, number:2, value:'foo'},
{bool:false, number:1, value:'bar'}]
我想做的是获取“值”,其中bool = true,AND number = 1。因此,我想要一个在此示例中返回“ world”的查询。
如果我可以获取对象的索引,其中bool = true和number = 1,那么在本例中它将返回'$ [1]'。
我试图在整个列上运行查询,将新列设置为从查询返回的值。 MySQL JSON函数有可能吗?我已经查看了引用,但没有一个像我的示例那样在数组内有对象。
编辑:如果我愿意
SELECT JSON_SEARCH(column->"$[*]", 'all', '1');
SELECT JSON_SEARCH(names->"$[*]", 'all', 'true');
我分别获得数字= 1和bool = true的对象的路径/索引。我希望这两个结果重叠。
答案 0 :(得分:0)
您可以使用JSON_TABLE
将JSON转换为派生表,然后从中提取值:
SELECT j.value
FROM test t
JOIN JSON_TABLE(t.jsonStr,
'$[*]'
COLUMNS(bool BOOLEAN PATH '$.bool',
number INT PATH '$.number',
value VARCHAR(20) PATH '$.value')) j
WHERE j.bool = true AND j.number = 1
输出:
value
world
如果您也想要获取匹配的value
的每个JSON值内的索引,则可以在FOR ORDINALITY
中添加JSON_TABLE
子句,例如:
SELECT j.idx, j.value
FROM test t
JOIN JSON_TABLE(t.jsonStr,
'$[*]'
COLUMNS(idx FOR ORDINALITY,
bool BOOLEAN PATH '$.bool',
number INT PATH '$.number',
value VARCHAR(20) PATH '$.value')) j
WHERE j.bool = true AND j.number = 1
输出:
idx value
2 world