如何使IN子句中未匹配的numit对应的id列返回NULL?
解决IN子句返回所有指定值(含无匹配项)的SQL写法
要实现你要的效果,核心思路是先构造包含所有目标numit的临时数据集,再和原表做左连接——这样就能保留所有你指定的numit值,没有对应id的自然就会显示NULL了。给你两种适配不同数据库的写法:
通用型写法(支持PostgreSQL、MySQL 8.0+、SQL Server等)
用VALUES子句快速生成临时数据集,再左连接原表:
SELECT t.numit, p.id FROM ( VALUES (40363), (40366), (40310), (40320), (40362), (40364), (40385), (40415) ) AS t(numit) LEFT JOIN pecas p ON t.numit = p.numit -- 如果你需要和期望结果的顺序完全一致,加上下面的ORDER BY ORDER BY FIELD(t.numit, 40362, 40363, 40366, 40310, 40320, 40364, 40385, 40415);
兼容老版本MySQL的写法(无VALUES支持时)
用UNION ALL拼接出临时数据集:
SELECT t.numit, p.id FROM ( SELECT 40363 AS numit UNION ALL SELECT 40366 UNION ALL SELECT 40310 UNION ALL SELECT 40320 UNION ALL SELECT 40362 UNION ALL SELECT 40364 UNION ALL SELECT 40385 UNION ALL SELECT 40415 ) AS t LEFT JOIN pecas p ON t.numit = p.numit -- 指定顺序的话同样用FIELD函数 ORDER BY FIELD(t.numit, 40362, 40363, 40366, 40310, 40320, 40364, 40385, 40415);
原理说明
左连接(LEFT JOIN)会完整保留左表(我们构造的临时表)的所有记录,右表(pecas)中没有匹配的行,对应的字段就会填充为NULL,完全符合你要的结果。如果不需要特定顺序,可以去掉ORDER BY子句。
内容的提问来源于stack exchange,提问作者Bruno Ienne
相关产品推荐
相关产品推荐

