You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在MySQL中查询JSON列包含指定值的数据行?

问题描述

现有数据表:

idlessons
1["3M-232","3M-313"]
2["3M-311","3M-312"]
3["3M-443","3M-565"]
4["4M-232","4M-313"]
5["4M-311","4M-312"]
6["4M-443","4M-565"]

需求:查询lessons列中包含"3M-232"的数据行,预期仅返回id为1的行。

当前使用的SQL语句无法得到正确结果:

SELECT * FROM merged_lesson where lessons = "3M-232";

原因是lessons是JSON数组类型,直接用等于号匹配单个元素不生效,需要根据数据库类型使用对应的JSON数组查询方法。


解决方案

MySQL(5.7及以上版本)

使用JSON_CONTAINS函数检查数组是否包含目标元素:

SELECT * FROM merged_lesson WHERE JSON_CONTAINS(lessons, '"3M-232"');

注意:目标值需要用双引号包裹,符合JSON字符串的格式要求。

PostgreSQL

推荐使用@>运算符(JSONB包含判断,性能更优):

SELECT * FROM merged_lesson WHERE lessons::jsonb @> '["3M-232"]'::jsonb;

也可以通过展开数组进行匹配:

SELECT DISTINCT ml.* 
FROM merged_lesson ml,
     jsonb_array_elements(ml.lessons) elem
WHERE elem = '"3M-232"';

SQL Server

通过OPENJSON解析数组后匹配:

SELECT ml.*
FROM merged_lesson ml
CROSS APPLY OPENJSON(ml.lessons) j
WHERE j.value = '3M-232';

SQLite

使用json_each展开数组进行匹配:

SELECT DISTINCT ml.*
FROM merged_lesson ml,
     json_each(ml.lessons)
WHERE json_each.value = '3M-232';

内容的提问来源于stack exchange,提问作者Enock Willy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 01:05:17