MySQL json_contains_path未按预期检查JSON数组所有对象问题排查
问题原因解析
你用的json_contains_path(images, 'all', '$[*].path_mini'),在'all'模式下的逻辑是要求数组里所有对象都包含path_mini键才返回1,反过来=0就只会匹配所有对象都没有这个键的行,这和你要的“数组里有至少一个对象没path_mini”完全不是一回事。
MySQL文档里说的“检查数组所有对象”,是指'all'模式会遍历所有对象,只有全部满足路径存在才返回1;如果用'one'模式,是只要有一个对象有这个键就返回1。但你的需求是找“存在没有键的对象”,这俩模式都没法直接对应,所以才会出现不符合预期的结果。
正确的查询写法
要筛选出images数组里至少有一个对象没有path_mini键的行,给你两种可行写法:
方式一:用JSON_TABLE展开数组判断
SELECT DISTINCT cp.* FROM catalog_products cp JOIN JSON_TABLE( cp.images, '$[*]' COLUMNS ( has_path_mini INT PATH '$.path_mini' EXISTS ) ) jt WHERE json_length(cp.images) > 0 AND jt.has_path_mini = 0;
这个写法把数组拆成一行一行的记录,每一行对应数组里的一个对象,has_path_mini会标记这个对象有没有path_mini键(0就是没有),最后通过DISTINCT去重,得到原表中符合条件的行。
方式二:用JSON_SEARCH反向查找
SELECT * FROM catalog_products WHERE json_length(images) > 0 AND json_search(images, 'one', NULL, NULL, '$[*].path_mini') IS NOT NULL;
json_search在这里会查找数组中path_mini不存在(或者值为NULL)的元素,只要能找到,就说明数组里有符合要求的对象,这时候就会返回该行。
内容的提问来源于stack exchange,提问作者KorbenDallas
相关产品推荐
相关产品推荐

