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

如何在ON子句中使用IN()关联表?JSON数组字段关联问题

解决数组字段关联表并拼接结果的SQL问题

嘿,我明白你的问题啦——你原来的SQL语句没法正常工作,核心原因是IN操作符没法直接处理数组类型的字段,u.category是一个数组,不是IN期望的离散值列表,所以数据库没法正确匹配关联关系。下面根据不同的数据库类型,给你对应的解决方案:

PostgreSQL(原生支持数组类型)

PostgreSQL对数组的支持很友好,你可以用ANY操作符来匹配数组中的元素,再用STRING_AGG函数拼接分类名称:

SELECT 
    u.name AS name,
    STRING_AGG(c.name, ', ') AS category
FROM "user" u
INNER JOIN category c ON c.id = ANY(u.category)
GROUP BY u.id, u.name;
  • c.id = ANY(u.category):检查分类ID是否存在于用户的category数组中
  • STRING_AGG(c.name, ', '):将匹配到的多个分类名称用逗号加空格拼接成一个字符串
  • GROUP BY:按用户ID和姓名分组,确保每个用户只返回一条结果

MySQL(通常存储为带括号的字符串)

如果你的u.category是存储成类似[2,4]的字符串(MySQL无原生数组),需要先清理掉括号,再用FIND_IN_SET匹配,最后用GROUP_CONCAT拼接:

SELECT 
    u.name AS name,
    GROUP_CONCAT(c.name SEPARATOR ', ') AS category
FROM `user` u
INNER JOIN category c ON FIND_IN_SET(c.id, REPLACE(REPLACE(u.category, '[', ''), ']', '')) > 0
GROUP BY u.id, u.name;
  • REPLACE(REPLACE(u.category, '[', ''), ']', ''):把[2,4]转换成2,4格式的字符串
  • FIND_IN_SET(c.id, ...):判断分类ID是否在清理后的字符串中
  • GROUP_CONCAT:拼接多个分类名称

SQL Server(JSON数组存储)

如果u.category是JSON格式的数组,用OPENJSON解析数组为行数据,再关联分类表:

SELECT 
    u.name AS name,
    STRING_AGG(c.name, ', ') AS category
FROM "user" u
CROSS APPLY OPENJSON(u.category) WITH (id INT '$') AS j
INNER JOIN category c ON c.id = j.id
GROUP BY u.id, u.name;
  • OPENJSON(u.category) WITH (id INT '$'):把JSON数组解析成包含id字段的行
  • CROSS APPLY:将解析后的行和原用户表关联
  • STRING_AGG:拼接分类名称

额外建议

这种直接存储数组/逗号分隔字符串的方式其实不符合数据库设计的第三范式,长期来看,建议新建一个中间表user_category,字段为user_id和category_id,用来存储用户和分类的关联关系。这样不仅查询更高效,后续维护(比如新增/删除用户分类)也会更方便。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:38:22