Oracle数据库:将逗号分隔ID字段转换为逗号分隔名称字段
逗号分隔组ID转对应组名称的实现方案
核心思路是先拆分逗号分隔的ID为多行,关联UGM表匹配名称,再重新聚合为逗号分隔的名称字符串。以下是主流数据库的具体实现:
MySQL 8.0+
假设UAC表字段为user_id、group_ids(格式如'1, 2, 3'),UGM表字段为id、group_name:
SELECT u.user_id, GROUP_CONCAT(g.group_name SEPARATOR ', ') AS group_names FROM UAC u JOIN JSON_TABLE( -- 把逗号分隔ID转为JSON数组格式 CONCAT('["', REPLACE(u.group_ids, ', ', '","'), '"]'), '$[*]' COLUMNS(group_id INT PATH '$') ) j JOIN UGM g ON j.group_id = g.id GROUP BY u.user_id;
如果group_ids无空格(如'1,2,3'),将REPLACE里的', '改为','即可。
SQL Server 2017+
利用STRING_SPLIT拆分字符串,STRING_AGG聚合结果:
SELECT u.user_id, STRING_AGG(g.group_name, ', ') AS group_names FROM UAC u -- 拆分逗号分隔的ID列表 CROSS APPLY STRING_SPLIT(u.group_ids, ', ') j -- 转换拆分后的字符串为INT并关联UGM JOIN UGM g ON TRY_CAST(j.value AS INT) = g.id GROUP BY u.user_id;
TRY_CAST用于避免无效ID导致的查询报错,若需保留所有用户(包括ID无效的),将JOIN改为LEFT JOIN。
PostgreSQL
通过STRING_TO_ARRAY转数组,UNNEST拆分行,再聚合:
SELECT u.user_id, STRING_AGG(g.group_name, ', ') AS group_names FROM UAC u -- 拆分ID列表为多行 CROSS JOIN UNNEST(STRING_TO_ARRAY(u.group_ids, ', ')) AS j(group_id) -- 转换类型后关联UGM JOIN UGM g ON j.group_id::INT = g.id GROUP BY u.user_id;
注意事项
- 确保
group_ids中的ID格式统一,无多余特殊字符,避免拆分或转换失败。 - 若需将结果写入另一张表,只需在上述SQL外层套
INSERT INTO target_table(user_id, group_names) (...)即可。
内容的提问来源于stack exchange,提问作者Nap14hockey
相关产品推荐
相关产品推荐

