SQL左连接合并同名字段:主表非空优先,空值取从表值
解决双表LEFT JOIN后字段合并的问题
当然可以实现你的需求,核心是用SQL的COALESCE()函数逐个合并同名字段——这个函数会返回传入参数里的第一个非空值,完美匹配你"优先取主表非空值,主表为空则取从表值"的要求。
修改后的完整SQL语句
select distinct COALESCE(T1.data1, T2.data1) AS data1, COALESCE(T1.data2, T2.data2) AS data2, COALESCE(T1.data3, T2.data3) AS data3, COALESCE(T1.data4, T2.data4) AS data4 from TABLE_ONE T1 left join TABLE_TWO T2 on T1.data1 = T2.data1 and (T1.data2 = T2.data2 OR (T1.data2 = '' OR T2.data2 = '')) and (T1.data3 = T2.data3 OR (T1.data3 = '' OR T2.data3 = ''))
逻辑说明
- 替换原来的
select distinct *为显式字段定义,每个字段用COALESCE(主表字段, 从表字段)合并:- 比如
COALESCE(T1.data2, T2.data2)会先取T1的data2值,若T1的data2是空字符串,则取T2的data2值,对应你示例中car行的data2会返回spain - 对于主表非空的字段(比如car行的data1、data3、data4),直接保留主表的值
- 比如
结果验证
执行修改后的SQL后,会得到你期望的合并结果:
| data1 | data2 | data3 | data4 |
|---|---|---|---|
| car | spain | red | 4 |
| bike | blue | 9 |
补充提示
- 若你的空值实际是
NULL而非空字符串,需要把关联条件里的like ''改成IS NULL,COALESCE()同样能处理NULL的情况 - 如果你的关联逻辑已经能保证不会产生重复行,可以去掉
distinct
内容的提问来源于stack exchange,提问作者mikestr
相关产品推荐
相关产品推荐

