如何从带分隔符的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
相关产品推荐
相关产品推荐

