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

Oracle中如何将表内逗号分隔的ID转换为对应姓名并拼接返回

Oracle实现ID转姓名拼接查询方案

首先约定演示用表结构:

  • 人员映射表:person,字段ID(人员ID,数值类型)、NAME(人员姓名,字符串类型)
  • 家族信息表:family,字段FAMILY_NAME(家族名称,字符串类型)、BROTHERS(兄弟ID逗号分隔字符串)、SISTERS(姐妹ID逗号分隔字符串)

推荐写法(兼容Oracle 12c及以上版本)

用XMLTABLE拆分字符串,逻辑简洁不易产生重复数据:

SELECT
    f.family_name,
    -- 转换兄弟ID为姓名拼接
    (
        SELECT LISTAGG(p.name, ',') WITHIN GROUP (ORDER BY TO_NUMBER(t.id_val))
        FROM family f1,
             XMLTABLE(('"' || REPLACE(f1.brothers, ',', '","') || '"')) COLUMNS id_val VARCHAR2(10) PATH '.'
        JOIN person p ON p.id = TO_NUMBER(t.id_val)
        WHERE f1.family_name = f.family_name
    ) AS brothers,
    -- 转换姐妹ID为姓名拼接
    (
        SELECT LISTAGG(p.name, ',') WITHIN GROUP (ORDER BY TO_NUMBER(t.id_val))
        FROM family f2,
             XMLTABLE(('"' || REPLACE(f2.sisters, ',', '","') || '"')) COLUMNS id_val VARCHAR2(10) PATH '.'
        JOIN person p ON p.id = TO_NUMBER(t.id_val)
        WHERE f2.family_name = f.family_name
    ) AS sisters
FROM family f
WHERE f.family_name = 'Stark';

兼容低版本Oracle写法(支持11g及以上)

用CONNECT BY拆分字符串,适配老版本环境:

WITH stark_base AS (
    -- 先过滤出Stark家族的基础数据
    SELECT family_name, brothers, sisters FROM family WHERE family_name = 'Stark'
),
-- 拆分兄弟ID为多行
brother_split AS (
    SELECT DISTINCT REGEXP_SUBSTR(brothers, '[^,]+', 1, LEVEL) AS id
    FROM stark_base
    CONNECT BY REGEXP_SUBSTR(brothers, '[^,]+', 1, LEVEL) IS NOT NULL
),
-- 拆分姐妹ID为多行
sister_split AS (
    SELECT DISTINCT REGEXP_SUBSTR(sisters, '[^,]+', 1, LEVEL) AS id
    FROM stark_base
    CONNECT BY REGEXP_SUBSTR(sisters, '[^,]+', 1, LEVEL) IS NOT NULL
),
-- 拼接兄弟姓名
brother_agg AS (
    SELECT LISTAGG(p.name, ',') WITHIN GROUP (ORDER BY TO_NUMBER(bs.id)) AS brothers
    FROM brother_split bs
    JOIN person p ON p.id = TO_NUMBER(bs.id)
),
-- 拼接姐妹姓名
sister_agg AS (
    SELECT LISTAGG(p.name, ',') WITHIN GROUP (ORDER BY TO_NUMBER(ss.id)) AS sisters
    FROM sister_split ss
    JOIN person p ON p.id = TO_NUMBER(ss.id)
)
SELECT 
    sb.family_name,
    ba.brothers,
    sa.sisters
FROM stark_base sb, brother_agg ba, sister_agg sa;

逻辑说明

  • 第一步将逗号分隔的ID字符串拆分为多行单个ID值
  • 拆分后的ID关联人员映射表获取对应的姓名,ORDER BY TO_NUMBER(id)保证姓名顺序和原始ID顺序一致
  • 用LISTAGG聚合函数将多行姓名重新拼接为逗号分隔的单行字符串

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 23:36:05