SQL如何拼接表中多列值并去除重复值(外连接结果场景)
多列拼接去重生成单列结果实现方案
场景说明
外连接查询得到的结果表包含ColumnA、ColumnB两个字段,样例数据如下:
ColumnA ColumnB -------------------- 12345 null 69875 null null 15648 76582 76582 null 29829 35731 35731
处理规则:
- 逐行读取两列数据,任意一列为
null时取另一列的非空值 - 两列值相同时仅保留一份
- 最终输出无重复值的单列
ColumnC,期望结果如下:
ColumnC ------- 12345 69875 15648 76582 29829 35731
实现方式
写法1:适配当前样例场景(简洁高效)
用标准SQL的COALESCE函数逐行取第一个非空值,搭配DISTINCT全局去重,兼容MySQL、PostgreSQL、SQL Server、BigQuery等绝大多数数据库:
SELECT DISTINCT COALESCE(ColumnA, ColumnB) AS ColumnC FROM 你的外连接结果表;
逻辑说明:COALESCE入参从左到右判断,遇到第一个非null值就直接返回,刚好匹配「空值取另一列、同值只留一份」的逐行处理逻辑,外层DISTINCT会兜底过滤所有重复条目,针对当前样例场景的执行效率最高。
写法2:兼容更复杂场景(鲁棒性更强)
如果后续外连接结果可能出现「同一行两列都非空且值不相等」的情况(比如ColumnA=123, ColumnB=456),写法1会漏掉其中一个值,此时用UNION合并两列的非空结果即可,UNION自带全局去重能力,无需额外加去重关键字:
SELECT ColumnA AS ColumnC FROM 你的外连接结果表 WHERE ColumnA IS NOT NULL UNION SELECT ColumnB AS ColumnC FROM 你的外连接结果表 WHERE ColumnB IS NOT NULL;
逻辑说明:该写法会把两列所有非空值全部汇总后自动去重,不管是行内两列值重复、还是跨行的值重复,都会被过滤,适配所有可能的外连接结果场景。
内容的提问来源于stack exchange,提问作者Ivan Alducin
相关产品推荐
相关产品推荐

