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

bttbmeg0  于 2023-10-15  发布在  Mysql
关注(0)|答案(1)|浏览(123)

我试图获取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语句(基于从post中得到的一些线索):

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语句产生空结果。
如能澄清如何完成目标任务,将不胜感激。

k3bvogb1

k3bvogb11#

您可以使用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|
查看演示here

相关问题