mysql - 在 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
试图
select * from audits WHERE JSON_SEARCH(new_values, 'all', '8', 'video_status_ids', '$[*]');
select * from audits WHERE JSON_SEARCH(new_values, 'all', '8', NULL, '$[video_status_ids.*]');
SELECT * FROM audits WHERE JSON_SEARCH(new_values, 'all', '8', NULL, '$.video_status_ids.*')
获取 0 条记录
和其他一些查询,但无法获得预期的结果。
通过引用这个,但我得到了 0 条记录。
解决方案
您的问题是 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
工作解决方案
SELECT * FROM audits WHERE JSON_CONTAINS(new_values->>'$.video_status_ids', '8')
推荐阅读
- asp.net-core - JavaScript 停止使用 AspNetCore Blazor
- ios - 如何在 SwiftUI 中将多个视图推送到 NavigationView 中
- python - 我使用 loc 函数知道其索引的值无法更新同一索引中的另一列的问题?
- python - 在记事本++中将列与负值和正值对齐
- flutter - 无法从函数调用列表
- algorithm - 找到至少具有 X 长度的第一个区间的算法
- python - 如何找到屏幕上某个像素的RBG颜色?
- sql-server - 如何在我的sql查询中实现多个条件
- java - 缺少 JavaFX 运行时组件,需要从 java -jar myprogram.jar 运行此应用程序
- flutter - TextField中的标签文本不会居中?