You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何使用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

火山引擎 最新活动