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

MySQL联表查询:用CASE WHEN获取消费者有效地址且无地址置空的实现

查询语句调整方案

原语句的问题点

  • 直接写JOIN默认是内连接,只会保留两张表能匹配上的记录,像id=3没有任何地址的Rico会被直接过滤,根本不会出现在结果里,满足不了“无地址返回NULL”的要求
  • 关联地址表的时候没加状态过滤,会把消费者的所有地址(包括status=0的无效地址)都带出来,就算在SELECT里写CASE判断,也会每个消费者查出两行结果,和预期的单条有效地址对不上
  • 列别名自定义成大驼峰格式,和预期结果要求的列名不匹配

可直接用的修正SQL

SELECT 
  c.id_consumer, 
  c.name,
  ca.address,
  ca.status
FROM consumer c
-- 换成左连接,全量保留消费者表的记录,没匹配到地址的字段自动为NULL
LEFT JOIN consumer_address ca 
  ON ca.id_consumer = c.id_consumer 
  -- 关联条件里直接只匹配status=1的有效地址,直接把无效地址全部排除
  AND ca.status = 1

匹配效果说明

  • 有有效地址的Roy、Dori,都会只关联到自己那条status=1的地址,直接取字段值就行,不用写复杂的CASE逻辑
  • 没有任何地址记录的Rico,左连接匹配不到地址表的行,address和status字段自然返回NULL,跑出来的结果和要求的预期表完全一致

补充:如果后续业务出现同一个消费者有多条status=1的地址,只要在最后加GROUP BY c.id_consumer就能保证每个消费者只出一行,当前测试数据里不存在这个情况,不需要额外加。

内容的提问来源于stack exchange,提问作者rico ardi saputra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.23 23:36:06