问题背景
在mysql数据库中,当某个字段存储的是json数组(如["喷绘","2.6m喷绘","m喷绘","直喷","双透","气模"]
),需要查询数组中包含特定字符串(如’气模’)的记录时,传统的like
语句无法直接使用。本文介绍两种高效的解决方案。
解决方案对比
1. 精确匹配方案(推荐)
当需要完全匹配数组中的元素时(如精确查找"气模"):
select * from process_unit_prices where process_name = '制图' and json_contains(craft_name, json_quote('气模')) limit 1;
1.核心函数:
json_quote()
: 将字符串转为json格式(如"气模"
)json_contains()
: 检查json数组中是否包含指定值
2.优点:效率高,精确匹配数组元素
3.注意:必须元素完全相等才会匹配(如"气模车"
不会匹配)
2. 模糊匹配方案
当需要部分匹配元素内容时(如查找包含"气模"子串的元素):
select * from process_unit_prices where process_name = '制图' and json_search(craft_name, 'one', '%气模%') is not null limit 1;
1.核心函数:
json_search()
: 搜索json中匹配模式的路径'one'
: 找到第一个匹配即停止'%气模%'
: sql的like通配符模式
2.优点:支持模糊匹配
3.注意:效率低于精确匹配,大数据量时需谨慎
参数化查询示例
在mybatis等orm框架中使用(如spring boot项目):
<!-- 精确匹配 --> <select id="findprocess" resulttype="processprice"> select * from process_unit_prices where process_name = #{processtype} and json_contains(craft_name, json_quote(#{craft})) limit 1 </select> <!-- 模糊匹配 --> <select id="findprocessfuzzy" resulttype="processprice"> select * from process_unit_prices where process_name = #{processtype} and json_search(craft_name, 'one', concat('%', #{craft}, '%')) is not null limit 1 </select>
使用场景建议
场景 | 推荐方案 | 示例 |
---|---|---|
分类标签匹配 | 精确匹配 | 工艺类型=[“雕刻”,“喷涂”] |
关键字搜索 | 模糊匹配 | 描述包含"紧急"的订单 |
多值属性过滤 | 精确匹配 | 颜色=[“红”,“蓝”] |
性能优化贴士
索引优化:mysql 8.0+可为json字段创建函数索引
create index idx_craft on process_unit_prices((cast(craft_name as char(255))));
数据规范:若常需查询,建议拆分为关系表
避免全模糊:%气模%
无法使用索引,尽量用气模%
经验总结:json字段查询虽灵活,但需谨慎使用。精确匹配首选json_contains
,模糊需求再用json_search
,并注意性能影响。在数据设计阶段评估是否真需json结构,关系表通常更高效。
知识扩展
下面小编为大家整理了mysql 匹配查询json字段的相关方法,希望对大家有所帮助
在 mysql 中,如果你存储的是 json 数据,并且需要检查某个 json 字段是否包含一个特定的键值对(例如 {user1: 1}
),你可以使用 mysql 提供的 json 函数来实现。
1. 使用 json_contains() 函数
json_contains()
函数可以检查一个 json 字段是否包含另一个 json 值。该函数返回一个布尔值,如果第一个参数(json 数据)包含第二个参数(查询条件),则返回 1
,否则返回 0
。
示例查询:
假设你的表结构如下:
create table users ( id int auto_increment primary key, user_data json );
你可以通过 json_contains()
函数来检查 json 字段是否包含 {user1: 1}
。
select * from users where json_contains(user_data, '{"user1": 1}');
这条 sql 语句会返回所有 user_data
字段包含 {user1: 1}
键值对的记录。
2. json_contains() 函数的使用细节
- 第一个参数是你要查询的 json 字段。
- 第二个参数是你要查找的 json 数据,必须是一个有效的 json 格式字符串。
- 该函数会检查 json 字段中是否存在第二个参数所表示的键值对。
3. 查询部分匹配
如果你只想检查 json 字段中是否存在某个键(例如 user1
)并且该键的值是 1
,而不关心 json 字段中的其他内容,你仍然可以使用 json_contains()
,但是需要确保第二个参数符合你想要的结构。
select * from users where json_contains(user_data, '{"user1": 1}');
4. 检查 json 字段中是否包含某个键
如果你不关心键值对,只想检查 json 字段中是否包含某个键(比如 user1
),可以使用 json_extract()
或 json_unquote()
与 is not null
来实现。
select * from users where json_unquote(json_extract(user_data, '$.user1')) = '1';
json_extract(user_data, '$.user1')
提取user_data
字段中的user1
键的值。json_unquote()
去除引号,使其返回一个普通值。- 比较提取的值是否等于
'1'
。
小结
json_contains()
:用于检查 json 字段是否包含某个指定的键值对。json_extract()
+json_unquote()
:可以用来提取并比较 json 字段中的值。
使用 json_contains()
是检查 json 数据是否包含某个完整键值对的简便方法。如果你需要更细粒度的查询(如只关心键是否存在且其值为特定值),可以结合 json_extract()
和 json_unquote()
进行操作。
到此这篇关于mysql查询json数组字段包含特定字符串的方法的文章就介绍到这了,更多相关mysql查询json字段内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论