在 null 上执行联接 = 在日期上执行 null



我想在日期字段上连接两个表

INNER JOIN ##MetricBase
ON  A.MetricID = ##MetricBase.MetricID
AND     A.ImportDate = ##MetricBase.ImportDate

如果日期为空,我还希望数据匹配。

有没有比这更清洁的方法

 INNER JOIN ##MetricBase
 ON    A.MetricID = ##MetricBase.MetricID
 AND   (A.ImportDate = ##MetricBase.ImportDate OR
        A.ImportDate IS NULL AND  ##MetricBase.ImportDate IS NULL)

补遗

一些评论建议我避免使用无效日期。此查询是分组集的一部分

 GROUP BY GROUPING SETS(
(BossID, ID, ImportDate),
(BossID, ImportDate),
(BossID),
(BossID, ID),
(ImportDate),
()
)

空值将成为数据集的一部分

目前有一个

MS Connect 请求支持IS DISTINCT FROM,这是正确的 ISO 方式。缺乏支持目前是脖子上的痛苦,而你已经这样做的方式实际上在技术上是正确的。

有人确实想出了一个聪明的解决方法,但它并不适用于所有情况。在您的情况下,我相信它会写成:

INNER JOIN ##MetricBase
ON A.MetricID = ##MetricBase.MetricID
AND EXISTS(SELECT A.ImportDate INTERSECT SELECT ##MetricBase.ImportDate)

据说,最新版本的SQL Server非常擅长优化这一点。

从逻辑上讲,你不能进一步减少它,因为由于许多其他原因null它不等于任何东西,甚至它本身。

它保留在一个谓词中的语法技巧是使用具有"魔术"值的COALESCE。如果不运行测试,我不知道如果有的话会对性能产生什么影响。我相信您对这两个条件(等于或均为空)的明确陈述更清晰且更易于维护。但为了想法,这里是COALESCE版本:

DECLARE @nullDate date = '04-02-4242';
...
ON A.MetricID   = ##MetricBase.MetricID
AND COALESCE(A.ImportDate           , @nullDate) = 
    COALESCE(##MetricBase.ImportDate, @nullDate)

最新更新