You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 10:07:47