SQL Server含NULL值的表连接问题(SSMS 2016)
解决含NULL主键列的表连接问题(SQL Server 2016适用)
刚好碰到过类似的场景,给你分享两个可行的解决方案,针对SQL Server 2016(版本13.0)完全适用。
先明确你的表结构:
Table 1
Acct1 App1 1 A 2 B 3 C 4 D
Table 2
Acct2 App2 Product NULL A Bed 2 B Sofa 3 NULL Bed 4 D Bed
你的需求是获取仅包含Product = Bed的连接结果,期望输出:
Acct App Product 1 A Bed 3 C Bed 4 D Bed
问题核心
SQL中,NULL和任何值(包括另一个NULL)用=比较都会返回UNKNOWN,所以普通的INNER JOIN会漏掉那些其中一列是NULL的匹配项,这也是常规连接得不到正确结果的原因。
解决方案1:显式处理NULL匹配
直接在连接条件中明确判断NULL的情况,当两边字段都为NULL时视为匹配:
SELECT t1.Acct1 AS Acct, t1.App1 AS App, t2.Product FROM Table1 t1 INNER JOIN Table2 t2 ON -- 处理Acct列的匹配,包括两边都是NULL的情况 (t1.Acct1 = t2.Acct2 OR (t1.Acct1 IS NULL AND t2.Acct2 IS NULL)) AND -- 处理App列的匹配,包括两边都是NULL的情况 (t1.App1 = t2.App2 OR (t1.App1 IS NULL AND t2.App2 IS NULL)) WHERE t2.Product = 'Bed';
解决方案2:用COALESCE转换NULL为特定值
给NULL指定一个不会和现有数据冲突的替代值,让NULL可以通过替代值相等来匹配:
SELECT t1.Acct1 AS Acct, t1.App1 AS App, t2.Product FROM Table1 t1 INNER JOIN Table2 t2 ON -- 用-999替代Acct列的NULL(确保原表无此值) COALESCE(t1.Acct1, -999) = COALESCE(t2.Acct2, -999) AND -- 用'N/A'替代App列的NULL(确保原表无此值) COALESCE(t1.App1, 'N/A') = COALESCE(t2.App2, 'N/A') WHERE t2.Product = 'Bed';
说明
两种方案都能得到你期望的结果,你可以根据实际数据情况选择:
- 如果字段的可能值范围明确,方案2更简洁;
- 如果不确定是否存在冲突的替代值,方案1更稳妥。
内容的提问来源于stack exchange,提问作者jcal
相关产品推荐
相关产品推荐

