【问题标题】:How to get a json object with specific key values, from a json array column?如何从 json 数组列中获取具有特定键值的 json 对象?
【发布时间】:2019-06-13 02:22:09
【问题描述】:

在我的 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'}]

我想要做的是获得“价值”WHERE bool=true, AND number=1。所以我想要一个在本例中返回“世界”的查询。

如果我可以获取 bool=true 和 number=1 的对象的索引,在本例中它会返回 '$[1]',这也是可行的。

我正在尝试对整个列运行查询,将新列设置为查询返回的值。 MySQL JSON 函数可以做到这一点吗?我查看了引用,但没有像我的示例那样在数组中包含对象。

编辑:如果我这样做了

SELECT JSON_SEARCH(column->"$[*]", 'all', '1');
SELECT JSON_SEARCH(names->"$[*]", 'all', 'true');

我分别获得了 number=1 和 bool=true 的对象的路径/索引。我想要这两个结果的重叠。

【问题讨论】:

    标签: mysql arrays json object


    【解决方案1】:

    您可以使用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 值中获取索引,您可以在 JSON_TABLE 中添加一个 FOR ORDINALITY 子句,例如:

    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

    【讨论】:

    • 谢谢!这很有效,你的例子很有帮助
    • @JordanYoungs 不用担心。很高兴我能帮上忙。
    • 上述代码只在 Mysql 8.0 上成功运行。大于 mysql 5.7 小于 mysql 8.0 怎么办
    • @rdkrosan 如果您指的是版本 8.0.1 到 8.0.3(不支持 JSON_TABLE),则需要使用与 5.7 相同的解决方案。如果您需要这样的解决方案,您应该提出问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 2019-10-08
    • 2021-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多