如何用CASE条件修改关联表SQL:显示全部Model且按需返回Tw数据
解决SQL左外连接的条件过滤问题
嘿,这个问题我熟!咱们先看看你原来的SQL哪里出问题了,再给你最优的实现方案~
你原来的SQL里,把tw.completed = 1 AND tw.stock = 0放在了WHERE子句里,这会导致左外连接直接变成内连接的效果——因为那些没有匹配到tw记录的model行,tw的所有列都是null,null和1/0比较结果不成立,这些行就被过滤掉了,没法返回所有model数据。
要实现「返回所有model数据,仅当tw满足指定条件时返回tw数据」的需求,有两种常用方式,其中第一种是性能最优、写法最简洁的:
方式1:将tw的过滤条件移到JOIN的ON子句中
这是最推荐的写法,数据库在连接阶段就会只匹配符合条件的tw记录,不符合的话tw列自动为null,完美符合你的需求:
SELECT model.*, tw.* FROM model LEFT OUTER JOIN tw ON model.model_name = tw.model AND tw.completed = 1 AND tw.stock = 0 ORDER BY model.id;
方式2:使用CASE条件控制tw列的返回
如果明确要求用CASE来实现,那可以对每个tw列单独处理,当tw满足条件时返回对应值,否则返回null:
SELECT model.*, -- 对每个需要返回的tw列单独写CASE逻辑 CASE WHEN tw.completed = 1 AND tw.stock = 0 THEN tw.model ELSE NULL END AS tw_model, CASE WHEN tw.completed = 1 AND tw.stock = 0 THEN tw.completed ELSE NULL END AS tw_completed, CASE WHEN tw.completed = 1 AND tw.stock = 0 THEN tw.stock ELSE NULL END AS tw_stock, -- 其他tw列依此类推,按需添加 ORDER BY model.id;
不过要注意,第二种方式需要逐个处理tw的列,写起来比较繁琐,而且性能不如第一种——因为它会先把所有tw记录和model连接,再通过CASE过滤,而第一种在连接时就完成了过滤,效率更高。
内容的提问来源于stack exchange,提问作者user3616336
相关产品推荐
相关产品推荐

