首页 > 解决方案 > 在 mysql 表中检查 json 的 json_contains

问题描述

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

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

{"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 条记录

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

通过引用这个,但我得到了 0 条记录。

标签: mysqljson

解决方案


您的问题是 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

dbfiddle 上的演示

工作解决方案

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

推荐阅读