如何基于t1的shipment_type值过滤t2?含'All'场景处理
解决方案:根据t1的shipment_type过滤t2数据(支持'All'场景)
你的原SQL问题出在:当t1的shipment_type为'All'时,CASE语句没有对应分支,会返回NULL,而t2.shipment_type = NULL在SQL中永远不成立(NULL与任何值比较结果都是UNKNOWN),所以'All'场景下查不到任何数据。
下面是几种可行的修正写法:
写法一:直接用OR逻辑判断(最简洁)
SELECT t2.* FROM t2, t1 WHERE t1.shipment_type = 'All' OR t2.shipment_type = t1.shipment_type;
思路:如果t1是'All',第一个条件直接成立,返回所有t2数据;否则只匹配t2中类型与t1一致的数据。注意:如果t1有多条记录,需要确保其中只有一条有效配置(比如通过LIMIT 1或者先聚合t1的类型)。
写法二:用子查询单独获取t1的配置值
SELECT t2.* FROM t2 WHERE -- 如果t1是'All',直接返回所有数据 (SELECT shipment_type FROM t1) = 'All' -- 否则匹配对应的发货类型 OR t2.shipment_type = (SELECT shipment_type FROM t1);
思路:先通过子查询获取t1的shipment_type值,再分情况处理。适合t1只有单条配置记录的场景。
写法三:用CASE WHEN统一处理条件
SELECT t2.* FROM t2 WHERE CASE WHEN (SELECT shipment_type FROM t1) = 'All' THEN 1 ELSE (t2.shipment_type = (SELECT shipment_type FROM t1)) END = 1;
思路:用CASE WHEN把两种情况整合到一个条件里,当t1是'All'时返回1(条件成立),否则判断t2的类型是否匹配。
内容的提问来源于stack exchange,提问作者cey
相关产品推荐
相关产品推荐

