检查mysql表中json的json上的json_contains

时间:2019-03-20 07:28:42

标签: mysql json

我的表中有json数据,其中再次包含json值,例如下面的示例数据

这是laravel审核,审核表new_values列(类型:文本)记录 但对于这种特殊情况,我没有使用雄辩的或查询的生成器,它只是原始查询

{"video_status_ids":"[6, 8, 14, 29]"}

现在我要检查其中是否有8个。

我尝试过

select * from audits WHERE JSON_CONTAINS(new_values, '8', '$.video_status_ids')

JSON_CONTAINS(audits.new_values, CAST(' . $status . ' AS json), "$.video_status_ids")';

我尝试json_Search

  1. select * from audits WHERE JSON_SEARCH(new_values, 'all', '8', 'video_status_ids', '$[*]');

  2. select * from audits WHERE JSON_SEARCH(new_values, 'all', '8', NULL, '$[video_status_ids.*]');

  3. SELECT * FROM audits WHERE JSON_SEARCH(new_values, 'all', '8', NULL, '$.video_status_ids.*')

获取0条记录

和其他一些查询,但无法获得预期的结果。

通过引用this,但我得到0条记录。

2 个答案:

答案 0 :(得分:1)

您的问题是JSON数据中的“数组”实际上是一个字符串(请注意它周围的双引号)。因此,要在其中进行搜索,您首先需要先JSON_EXTRACT,然后JSON_UNQUOTE

SELECT JSON_CONTAINS(JSON_UNQUOTE(JSON_EXTRACT(new_values, '$.video_status_ids')), '8')
FROM audits

对于->>,您也可以使用简写JSON_UNQUOTE(JSON_EXTRACT())

SELECT JSON_CONTAINS(new_values->>'$.video_status_ids', '8')
FROM audits

Demo on dbfiddle

工作解决方案

SELECT * FROM audits WHERE JSON_CONTAINS(new_values->>'$.video_status_ids', '8')

答案 1 :(得分:0)

如果您查看JSON_CONTAINS的文档:

  

通过返回1或0来指示目标JSON文档中是否包含给定的候选JSON文档

它只能检查键的存在-不能搜索数组。

但是JSON_SEARCH()函数:

  

返回JSON文档中给定字符串的路径

这就是您所需要的。请记住,将路径作为最后一个参数传递,因为数组不是根元素。

Database.guide上有一篇非常不错的文章,关于使用JSON_SEARCH达到您的目的(包括语法帮助和示例):

https://database.guide/json_search-find-the-path-to-a-string-in-a-json-document-in-mysql/