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

如何将MariaDB中逗号分隔列值关联转换为对应名称?

解决方案

一、完全可以通过SQL实现批量转换

MariaDB支持递归CTE(公共表表达式)和字符串处理函数,能直接在查询层完成逗号分隔编码到对应名称的转换,不需要前端多次AJAX请求,批量处理效率更高。

具体SQL示例

假设Table_Policy有主键id,MODEL列存储逗号分隔编码;Table_DETAIL有code(对应编码)和name(对应名称)字段,可使用以下SQL查询:

WITH RECURSIVE split_models AS (
    -- 初始拆分:提取第一个编码,剩余部分留待递归处理
    SELECT 
        id,
        TRIM(SUBSTRING_INDEX(model, ',', 1)) AS model_code,
        TRIM(SUBSTRING(model, LENGTH(SUBSTRING_INDEX(model, ',', 1)) + 2)) AS remaining_models
    FROM Table_Policy
    WHERE model IS NOT NULL AND model != ''
    
    UNION ALL
    
    -- 递归拆分剩余编码
    SELECT 
        id,
        TRIM(SUBSTRING_INDEX(remaining_models, ',', 1)) AS model_code,
        TRIM(SUBSTRING(remaining_models, LENGTH(SUBSTRING_INDEX(remaining_models, ',', 1)) + 2)) AS remaining_models
    FROM split_models
    WHERE remaining_models IS NOT NULL AND remaining_models != ''
)
-- 关联详情表,合并对应名称
SELECT 
    p.*,
    GROUP_CONCAT(d.name SEPARATOR ', ') AS model_names
FROM Table_Policy p
LEFT JOIN split_models sm ON p.id = sm.id
LEFT JOIN Table_DETAIL d ON sm.model_code = d.code
GROUP BY p.id;

逻辑说明

  1. 递归CTEsplit_models将每个MODEL字段的逗号分隔值拆分为单独行,每行对应一个编码;
  2. 关联Table_DETAIL表,通过编码匹配获取对应的名称;
  3. 用GROUP_CONCAT将同一政策的所有名称合并为逗号分隔的字符串,和原表字段一起返回。

二、无需新增MVC方法

只需要调整现有查询逻辑即可:

  1. 在对应的MyBatis Mapper XML文件中,替换原SELECT语句为上述SQL;
  2. 调整返回的实体类(比如新增modelNames字段),或者直接用Map<String, Object>接收查询结果;
  3. 在JSP的数据网格中,将原来展示MODEL列的位置改为展示model_names(或实体类对应的属性名)。

三、注意事项

  • 确保Table_DETAIL的code字段与MODEL拆分后的编码完全匹配(包括大小写、空格),避免匹配失败;
  • 如果存在编码无对应名称的情况,可使用COALESCE(d.name, sm.model_code)替代d.name,保留原编码作为兜底值;
  • 若Table_Policy数据量较大,建议给id字段添加索引,提升递归查询的性能。

内容的提问来源于stack exchange,提问作者Just Do IT

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 04:50:06