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

如何从带分隔符的ID列表中获取对应国家名称(SQL实现)

实现指定格式的SQL查询方案

表结构说明

假设两张表的名称分别为:

  • 序列-国家ID表:seq_country,结构如下:
SEQ_ID  CountryID
  1     1|2
  2      1
  3     1|2|3
  • 国家信息表:country,结构如下:
CountryID   Name
   1        USA
   2        UK
   3        India

核心思路:先将seq_country表中用|分隔的CountryID拆分为单个ID,关联country表获取对应国家名称,再按SEQ_ID分组,将名称用|拼接成目标格式。

以下是主流数据库的具体实现:

MySQL(8.0及以上版本)

SELECT 
    sc.SEQ_ID,
    GROUP_CONCAT(c.Name SEPARATOR '|') AS Country
FROM seq_country sc
JOIN country c 
    ON FIND_IN_SET(c.CountryID, REPLACE(sc.CountryID, '|', ',')) > 0
GROUP BY sc.SEQ_ID
ORDER BY sc.SEQ_ID;

说明:通过REPLACE将分隔符|替换为FIND_IN_SET支持的逗号,实现关联匹配,再用GROUP_CONCAT完成字符串拼接。

SQL Server(2016及以上版本)

SELECT 
    sc.SEQ_ID,
    STRING_AGG(c.Name, '|') WITHIN GROUP (ORDER BY c.CountryID) AS Country
FROM seq_country sc
CROSS APPLY STRING_SPLIT(sc.CountryID, '|') s
JOIN country c ON c.CountryID = s.value
GROUP BY sc.SEQ_ID
ORDER BY sc.SEQ_ID;

说明:用STRING_SPLIT拆分分隔字符串,通过CROSS APPLY将拆分结果与原表关联,再用STRING_AGG分组拼接。

Oracle

方案1(使用正则匹配关联):

SELECT 
    sc.SEQ_ID,
    LISTAGG(c.Name, '|') WITHIN GROUP (ORDER BY c.CountryID) AS Country
FROM seq_country sc
JOIN country c 
    ON REGEXP_LIKE(sc.CountryID, '(^|\|)' || c.CountryID || '(\||$)')
GROUP BY sc.SEQ_ID
ORDER BY sc.SEQ_ID;

方案2(使用拆分函数):
若Oracle中没有内置拆分函数,可自定义拆分函数(比如STRUTIL.SPLIT),再关联查询:

SELECT 
    sc.SEQ_ID,
    LISTAGG(c.Name, '|') WITHIN GROUP (ORDER BY c.CountryID) AS Country
FROM seq_country sc,
     TABLE(STRUTIL.SPLIT(sc.CountryID, '|')) s
JOIN country c ON c.CountryID = s.COLUMN_VALUE
GROUP BY sc.SEQ_ID
ORDER BY sc.SEQ_ID;

说明:用LISTAGG函数完成分组后的字符串拼接,确保名称顺序与原ID顺序一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 23:51:10