JSON数组上的MySQL通配符

JSON数组上的MySQL通配符,mysql,sql,arrays,json,Mysql,Sql,Arrays,Json,我试图使用通配符提取JSON中包含的数组中的ID5384。我遇到的问题是ID的位置对于数组中的每个元素都没有固定的位置。该数组中的JSON示例如下,其中id:5384可以占据不同的索引位置: { "id":7465115, "name":"BCA_WS_FBX_Nielsen PRIZM_Test_Unlock_1x1", "advertiser_id":155085, "pixels":[ { "id":416491, "pixel_template

我试图使用通配符提取JSON中包含的数组中的ID5384。我遇到的问题是ID的位置对于数组中的每个元素都没有固定的位置。该数组中的JSON示例如下,其中id:5384可以占据不同的索引位置:

{  
  "id":7465115,
  "name":"BCA_WS_FBX_Nielsen PRIZM_Test_Unlock_1x1",
  "advertiser_id":155085,
  "pixels":[  
  {  
   "id":416491,
   "pixel_template_id":null,
  },
  {  
   "id":5384,
   "pixel_template_id":null,
  }
  ]
}
我的质询如下:

SELECT id, json FROM PROD_APPNEXUS.dimension_json_creatives 
WHERE JSON LIKE ('%pixels%_%"id":5384,%') AND MEMBER_ID = 364
我试图只提取像素数组中ID为5384的项目

任何关于如何实现这一目标的评论都将受到高度重视,谢谢

更新:MySQL版本5.6.17


Sam

我唯一想到的方法是使用MySQL的REGEXP语法:

SELECT id, json FROM PROD_APPNEXUS.dimension_json_creatives 
WHERE (JSON REGEXP '("pixels":\[)?.*"id":5384') AND MEMBER_ID = 364 

我想到的唯一方法是使用MySQL的REGEXP语法:

SELECT id, json FROM PROD_APPNEXUS.dimension_json_creatives 
WHERE (JSON REGEXP '("pixels":\[)?.*"id":5384') AND MEMBER_ID = 364 
尝试:

。MySQL 5.7.8+

选择 `id`, `json`-数据类型json 从…起 `PROD\u APPNEXUS`.`dimension\u json\u creatives` 哪里 JSON_包含`JSON`、'{id:5384}'、'$.pixels'和 `成员ID`=364; 更新

使用5.6.17,一个选项是:

选择 `id`, `json` 从…起 `PROD\u APPNEXUS`.`dimension\u json\u creatives` 哪里 `json“REGEXP”像素:\\[.*id:5384.*]'和 成员ID=364; 性能可能会受到表中元组数的影响。

请尝试:

。MySQL 5.7.8+

选择 `id`, `json`-数据类型json 从…起 `PROD\u APPNEXUS`.`dimension\u json\u creatives` 哪里 JSON_包含`JSON`、'{id:5384}'、'$.pixels'和 `成员ID`=364; 更新

使用5.6.17,一个选项是:

选择 `id`, `json` 从…起 `PROD\u APPNEXUS`.`dimension\u json\u creatives` 哪里 `json“REGEXP”像素:\\[.*id:5384.*]'和 成员ID=364; 根据表中元组的数量,性能可能会受到影响。

请尝试:

SELECT
  `id`,
   JSON_EXTRACT(json, '$.pixels') as pixels
FROM
  `PROD_APPNEXUS`.`dimension_json_creatives`
WHERE
  JSON_CONTAINS(`json`, '{"id": 5384}', '$.pixels') AND
  `MEMBER_ID` = 364;
请注意,您需要MySQL的版本>=5.7.8才能运行此功能

请尝试:

SELECT
  `id`,
   JSON_EXTRACT(json, '$.pixels') as pixels
FROM
  `PROD_APPNEXUS`.`dimension_json_creatives`
WHERE
  JSON_CONTAINS(`json`, '{"id": 5384}', '$.pixels') AND
  `MEMBER_ID` = 364;

请注意,您需要一个版本>=5.7.8的MySQL才能运行此功能

您是否应该删除LIKE表达式中的下划线?我在想,也许使用%\u%可以搜索像素,然后忽略所有非id:5384的字符,直到找到id:5384。确定,但是如果元素是数组中的第一个匹配项,则会丢失该元素。在任何情况下,考虑一下MySQL的5.7 JSON搜索功能:我认为%%会忽略{括号,而不是该ID的第一个匹配项(如果是这样的话)?您不应该删除LIKE表达式中的下划线吗?我想也许使用%%可以搜索像素,然后忽略所有非ID:5384的字符,直到找到ID:5384。当然,但是如果元素是数组中的第一个匹配项,您将错过该元素。I在任何情况下,考虑一下MySQL的5.7 JSON搜索功能:我认为%%会忽略{括号,如果是这种情况,则不是该ID的第一次出现?为我的版本工作。谢谢为我的版本工作。谢谢。我如何更新值?在这种情况下,我如何更新值?在这种情况下,我如何更新值?5384