我的表中有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
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条记录
和其他一些查询,但无法获得预期的结果。
通过引用this,但我得到0条记录。
答案 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
工作解决方案
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/