如何使用WHERE IN子句检查多维数组中的值?附数据表示例
嘿,我来帮你解决这个问题!你的数据表中DATA字段是嵌套了数组的JSON格式,要实现用WHERE IN子句检查rows数组里的unit值是否在指定列表中,不同数据库的处理方式略有不同,我给你整理了几种主流数据库的实现方案:
PostgreSQL 实现方案
PostgreSQL可以通过jsonb_array_elements(或json_array_elements,取决于你存储的是json还是jsonb类型)来展开JSON数组,再进行筛选:
SELECT t.* FROM your_table t CROSS JOIN LATERAL jsonb_array_elements(t.data::jsonb->'rows') AS j(row) WHERE (row->>'unit') IN ('10', '30') GROUP BY t.id, t.data;
说明:
t.data::jsonb->'rows'提取JSON中的rows数组;CROSS JOIN LATERAL将数组拆分成独立的行记录;row->>'unit'把unit字段转为文本类型,方便用IN子句匹配;GROUP BY是为了避免同一条原记录因多个匹配的row而重复输出。
MySQL 实现方案
MySQL 8.0及以上版本支持JSON_TABLE函数,可以把JSON数组转换成临时表关联查询:
SELECT DISTINCT t.* FROM your_table t JOIN JSON_TABLE( t.data, '$.rows[*]' COLUMNS ( unit VARCHAR(10) PATH '$.unit' ) ) AS jt WHERE jt.unit IN ('10', '30');
说明:
JSON_TABLE定义了如何从rows数组中提取unit字段生成临时表jt;DISTINCT用于去重,确保原表的每条记录只输出一次。
SQL Server 实现方案
SQL Server用OPENJSON来解析JSON数组,并配合WITH子句提取指定字段:
SELECT DISTINCT t.* FROM your_table t CROSS APPLY OPENJSON(t.data, '$.rows') WITH ( unit VARCHAR(10) '$.unit' ) AS j WHERE j.unit IN ('10', '30');
说明:
OPENJSON解析rows数组,WITH子句指定要提取的unit字段及其类型;CROSS APPLY相当于把解析后的数组行和原表记录关联起来;DISTINCT避免重复输出原表记录。
额外注意事项:
- 如果你的
DATA字段是字符串类型而非原生JSON类型,需要先转换为JSON格式,比如PostgreSQL用data::jsonb,MySQL用CAST(data AS JSON); - 若数据量较大,建议给JSON字段建立针对性索引(比如PostgreSQL的GIN索引、MySQL的JSON索引)来提升查询性能。
内容的提问来源于stack exchange,提问作者Tim Paine




