如何让SQL Server IN条件中所有值返回数据(含NULL条目)
解决方案:让未匹配的Key显示为NULL条目
当然可行!你当前的IN查询只会返回原表中存在匹配的记录,要把T4这类不存在的Key也以NULL条目展示,核心思路是先构造包含所有目标Key的数据集,再和原表做左连接(LEFT JOIN),这样左边的所有Key都会被保留,无匹配的就会自动填充NULL。
方法1:使用VALUES子句(简洁高效,SQL Server 2008+支持)
这是最直观的写法,直接把要查询的所有Key放在VALUES里作为临时数据集:
SELECT target_keys.KeyVal AS [Key], t.* -- 也可以指定具体需要的列,避免*带来的冗余 FROM (VALUES ('T1'), ('T2'), ('T3'), ('T4')) AS target_keys(KeyVal) LEFT JOIN [Table] t ON target_keys.KeyVal = t.[Key];
方法2:使用CTE(适用于更复杂的Key集合场景)
如果你的Key列表很长或者需要动态生成,可以用CTE(公共表表达式)来组织:
WITH TargetKeys AS ( SELECT 'T1' AS KeyVal UNION ALL SELECT 'T2' UNION ALL SELECT 'T3' UNION ALL SELECT 'T4' ) SELECT tk.KeyVal AS [Key], t.* FROM TargetKeys tk LEFT JOIN [Table] t ON tk.KeyVal = t.[Key];
关键说明
- 左连接(LEFT JOIN)会强制保留左边数据集的所有行,当原表
[Table]中没有对应Key的记录时,原表的所有列都会显示为NULL,完美实现你要包含T4的需求。 - 注意:如果你的
Key列是数值类型,记得去掉VALUES里的引号(比如写成(1,2,3,4))。另外Key是SQL Server的保留关键字,所以要用方括号[Key]包裹避免语法错误。
内容的提问来源于stack exchange,提问作者rani shanmugasundaram




