SQL左连接匹配城市,无匹配时使用默认值的实现方法
正确实现方案
你的原SQL逻辑错误,原因是LEFT JOIN中无匹配时V表字段为NULL,COALESCE(V.city = F.city, V.city="Default")的两个条件都会返回NULL,无法关联到Default记录,导致未匹配城市的Value为空。以下是两种可行的解决方法:
方法1:LEFT JOIN + 子查询取默认值
通过LEFT JOIN匹配城市,再用COALESCE将空值替换为Default对应的Value:
SELECT F.ID, F.City, COALESCE(V.Value, (SELECT Value FROM V WHERE City = 'Default')) AS Value FROM F LEFT JOIN V ON V.City = F.City;
该方法适用于V表中仅存在一条Default记录的场景(符合你的需求),子查询会直接返回默认值。
方法2:两次LEFT JOIN关联
分别关联匹配城市的记录和Default记录,再用COALESCE优先取匹配值,无匹配则用默认值:
SELECT F.ID, F.City, COALESCE(V_match.Value, V_default.Value) AS Value FROM F LEFT JOIN V V_match ON V_match.City = F.City LEFT JOIN V V_default ON V_default.City = 'Default';
这种方式无需子查询,逻辑更直观,同样适用于单条Default记录的场景。
内容的提问来源于stack exchange,提问作者GK89
相关产品推荐
相关产品推荐

