如何在JSON类型数组中精准提取/查找指定数值?
解决JSON数组中精准查找特定数值的问题
你说得对,用LIKE确实会因为字符串模糊匹配的特性,误匹配到包含目标数字的其他值(比如找4时命中64、1024)。其实很多人不知道,JSON_CONTAINS本身就支持JSON数组的匹配,它并不是只针对JSON对象的!下面分常见数据库给你具体方案:
MySQL 方案
1. 单个值匹配(用JSON_CONTAINS)
如果你的字段是JSON类型(比如名为json_array_col),直接用JSON_CONTAINS就能精准匹配数组中的单个元素:
SELECT * FROM your_table WHERE JSON_CONTAINS(json_array_col, '4') -- 匹配数组中的数字4 OR JSON_CONTAINS(json_array_col, '8'); -- 匹配数组中的数字8
这里要注意:如果数组里的元素是字符串类型(比如["4","8"]),那需要用JSON_QUOTE('4')来生成带引号的JSON字符串进行匹配:
SELECT * FROM your_table WHERE JSON_CONTAINS(json_array_col, JSON_QUOTE('4'));
2. 多个值批量匹配(用JSON_OVERLAPS,MySQL 8.0.17+支持)
如果要同时查找4或8,用JSON_OVERLAPS更简洁,它会检查两个JSON数组是否有交集:
SELECT * FROM your_table WHERE JSON_OVERLAPS(json_array_col, '[4,8]');
PostgreSQL 方案
PostgreSQL对JSON的支持也很友好,常用两种方式:
1. 用@>操作符(推荐)
如果是json或jsonb类型字段,@>操作符可以检查数组是否包含指定元素:
-- json类型 SELECT * FROM your_table WHERE json_array_col @> '[4,8]'::json; -- jsonb类型(性能更好,推荐存储为jsonb) SELECT * FROM your_table WHERE jsonb_array_col @> '[4,8]'::jsonb;
2. 展开数组筛选
如果需要更灵活的逻辑,可以用json_array_elements把数组展开成行,再筛选:
SELECT DISTINCT t.* FROM your_table t, json_array_elements(t.json_array_col) AS elem WHERE elem::integer IN (4,8);
加DISTINCT是为了避免同一行因为数组中有多个匹配元素而重复返回。
核心原理
这些JSON函数/操作符都是解析JSON结构后进行元素匹配,而不是把整个JSON当成字符串做模糊匹配,所以不会出现LIKE那种误匹配的情况,能精准定位数组中的单个元素。
内容的提问来源于stack exchange,提问作者Nii
相关产品推荐
相关产品推荐

