Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何选择来自WHERE条件的JSON对象的字段_Sql_Arrays_Json_Mariadb_Mariadb 10.5 - Fatal编程技术网

Sql 如何选择来自WHERE条件的JSON对象的字段

Sql 如何选择来自WHERE条件的JSON对象的字段,sql,arrays,json,mariadb,mariadb-10.5,Sql,Arrays,Json,Mariadb,Mariadb 10.5,我有这张桌子 id name json 1 alex {"type": "user", "items": [ {"name": "banana", "color": "yellow"}, {"name": "apple", "color": "red"} ] } 2

我有这张桌子

id  name   json
1   alex   {"type": "user", "items": [ {"name": "banana", "color": "yellow"}, {"name": "apple", "color": "red"} ] }
2   peter  {"type": "user", "items": [ {"name": "watermelon", "color": "green"}, {"name": "pepper", "color": "red"} ] }
3   john   {"type": "user", "items": [ {"name": "tomato", "color": "red"} ] }
4   carl   {"type": "user", "items": [ {"name": "orange", "color": "orange"}, {"name": "nut", "color": "brown"} ] }
重要的是,每个json对象可以有不同数量的项,但我需要的只是在WHERE条件下匹配的对象的产品名

我想要的输出是前两列和项目名称,其中颜色类似于%red%:

id name  fruit
1  alex  apple
2  peter pepper
3  john  tomato
如果您运行的是MySQL 8.0,我建议您使用json_表:

select t.id, t.name, x.name as fruit
from mytable t
cross join json_table(
    t.js,
    '$.items[*]' columns (name varchar(50) path '$.name', color varchar(50) path '$.color')
) x
where x.color = 'red'
此功能未在MariaDB中实现。我们可以借助数字表手动取消测试:

select t.id, t.name, 
    json_unquote(json_extract(t.js, concat('$.items[', x.num, '].name'))) as fruit
from mytable t
inner join (select 0 as num union all select 1 union all select 2 ...) x(num)
    on x.num < json_length(t.js, '$.items')
where json_unquote(json_extract(t.js, concat('$.items[', x.num, '].color'))) = 'red'
您可以使用JSON_EXTRACT函数和递归公共表表达式来动态生成行,例如

WITH RECURSIVE cte AS 
(
  SELECT 1 AS n
  UNION ALL
  SELECT n + 1
    FROM cte
   WHERE cte.n < (SELECT MAX(JSON_LENGTH(json)) FROM t )
)
SELECT id, name, 
       JSON_UNQUOTE(JSON_EXTRACT(json,CONCAT('$.items[',n-1,'].name'))) AS fruit
  FROM cte
  JOIN t
 WHERE JSON_EXTRACT(json,CONCAT('$.items[',n-1,'].color')) = "red"

这个JSON有效吗?我不这么认为!不一定是吗???我认为是这样!这不是有效的JSON。项目应该使用方括号,而不是花括号。items:[{name:banana,color:yellow},…]。假设JSON在一个JSON值中包含两个红色的水果-在这种情况下,您希望看到什么输出?您是如何创建插入到数据库中的JSON的?看起来需要先修复代码对不起!!!我在飞行中创造。。。这是无效的,抱歉,但这只是为了得到我正在运行的MariaDb 10.5。。。但我认为它不起作用:-@FlamingMoe:啊,好吧。。。您最初标记了您的问题MySQL,因为有一个单独的MariaDB标记,因此我的答案是。请参阅我的编辑以获取与MariaDB兼容的解决方案。
WITH RECURSIVE cte AS 
(
  SELECT 1 AS n
  UNION ALL
  SELECT n + 1
    FROM cte
   WHERE cte.n < (SELECT MAX(JSON_LENGTH(json)) FROM t )
)
SELECT id, name, 
       JSON_UNQUOTE(JSON_EXTRACT(json,CONCAT('$.items[',n-1,'].name'))) AS fruit
  FROM cte
  JOIN t
 WHERE JSON_EXTRACT(json,CONCAT('$.items[',n-1,'].color')) = "red"