在 JSON 对象中获取给定键名称的属性值

Get the value of a property given the name of a key, within a JSON object

提问人:txapeldot 提问时间:9/13/2023 最后编辑:Drewtxapeldot 更新时间:9/23/2023 访问量:53

问:

我正在尝试获取包含在对象中的属性的值,以满足另一个属性的名称与特定值匹配的条件。JSON

假设我已将以下 JSON 对象存储在列中:

{
"f2": [
    {"name":"f21","value":"foo_21"},
    {"name":"hit","value":"foo_hit"},
    {"name":"f22","value":"foo_22"}
]
}

我想获取值“foo_hit”,因为它的值与值“foo_hit”所属的 JSON 对象的给定名称“hit”匹配。请记住,匹配的 JSON 对象可以出现在数组中的任何位置。{"name":"hit","value":"foo_hit"}

要获取的预期值为(包括双引号)。"foo_hit"

为此,我尝试了以下 sql 语句(基于从这篇文章中获得的一些线索):

CREATE TABLE mytable (jsonstr JSON);

INSERT INTO mytable VALUES 
('{"f2": [{"name":"f21","value":"foo_21" }, 
          {"name":"hit","value":"foo_hit"}, 
          {"name":"f22","value":"foo_22" }]}');

SELECT JSON_EXTRACT(jsonstr,'$**.name') 
FROM mytable 
WHERE (JSON_EXTRACT(jsonstr,'$**.name')="hit");

但是该语句会产生一个空的结果。SELECT

如能说明如何完成目标任务,将不胜感激。

sql mysql json-extract json-table

评论

1赞 lemon 9/13/2023
你能用预期的输出更新你的帖子吗?
0赞 Nick 9/13/2023
在你的条款中,你有哪个是错误的。它应该是.但是,您会注意到,该表达式会返回示例数据的值数组,并且永远不会 .在MySQL 5.7中,您尝试做的事情非常困难,您可能需要考虑升级到MySQL 8WHERE$.**.name$**.name="hit"
0赞 txapeldot 9/13/2023
@Nick:感谢您的帮助;它输入错误,一旦纠正,我就重新表述了问题。实际上,它生成了一个值数组,这不是我想要实现的。我正在使用 MySQL 8。
0赞 txapeldot 9/13/2023
@lemon:已更新!经过澄清,我重新表述了这个问题。

答:

2赞 lemon 9/13/2023 #1

您可以使用 JSON_TABLE 从表中提取值。这将确保您的值正确链接到您的姓名。然后,使用相应的“value_”列过滤您的值就足够了。

SELECT tab.value_
FROM mytable, 
     JSON_TABLE(mytable.jsonstr->'$.f2',
                '$[*]' COLUMNS (name_  VARCHAR(30) PATH '$.name',
                                value_ VARCHAR(30) PATH '$.value')
               ) AS tab
WHERE tab.name_ = 'hit'

"输出“:

价值_
foo_hit

在此处查看演示。