如何从json数组列中获取具有特定键值的json对象?

时间:2019-01-18 19:38:04

标签: mysql arrays json object

在我的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的对象的路径/索引。我希望这两个结果重叠。

1 个答案:

答案 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

Demo on dbfiddle