我有一个头表和一个事务表。 标头表的 Id 值为 Null,描述有一些内容,而事务表的 Id 值为 null,用于描述一些内容。
现在,当我加入
Header.Id = Transaction.Id
时,我应该让 Id 具有匹配值以及空值,因为 id 与事务表中的空值匹配。
就像下面的查询:
SELECT
SH.HEADER_COLID,
SH.HEADER_COLDESCRIPTION,
S.SALEORDER_MONTH,
S.SALEORDER_YEAR,
SUM(S.SALEORDER_AMT),
SUM(S.SALEORDER_QTYCASES),
SUM(S.SALEORDER_QTYWGHTPNDS)
FROM SDS_HEADERS SH, SALEORDERS S
WHERE SH.HEADER_COLID = S.DIVISION
AND SH.COLUMN_ID =1
AND S.OPEN_CLOSE='false'
AND S.SALEORDER_YEAR='2021'
GROUP BY SH.HEADER_COLID, SH.HEADER_COLDESCRIPTION,
S.SALEORDER_MONTH, S.SALEORDER_YEAR
ORDER BY SH.HEADER_COLID, SH.HEADER_COLDESCRIPTION,
S.SALEORDER_MONTH, S.SALEORDER_YEAR ASC
我得到了
SH.HEADER_COLID = S.DIVISION
的匹配记录,但 HEADER_COLID 的空值应该与 DIVISION 空值匹配,但我没有得到这些记录。我需要它们,请帮助了解如何在雪花中实现这一目标。
现在,当我加入 Header.Id=Transaction.Id 时,我应该让 Id 具有匹配值以及空值,因为 id 与事务表中的空值匹配。
要将
NULL=NULL
视为 true,可以使用 NULL 安全运算符:
ON Header.Id IS NOT DISTINCT FROM Transaction.Id
样品:
CREATE TABLE t1 AS
SELECT 1 AS id, 'a' AS c UNION
SELECT 2, 'b' UNION
SELECT NULL, 'c';
CREATE TABLE t2 AS
SELECT 2 AS id UNION
SELECT 3 UNION
SELECT NULL;
查询:
SELECT *
FROM T1
JOIN T2
ON T1.ID = T2.ID;
-- id c id
-- 2 b 2
SELECT *
FROM T1
JOIN T2
ON T1.ID IS NOT DISTINCT FROM T2.ID;
-- id c id
-- 2 b 2
-- NULL c NULL
编辑:
可以采用不同的方法:
具体版本的使用取决于品味/惯例。
IS DISTINCT FROM
起初可能看起来很深奥,但它是在 SQL 标准中定义的。相关:卢卡斯·埃德尔的 IS DISTINCT FROM 谓词。
第二种方法的意图非常明确,并且在多个 RDBMS 之间兼容,但并不简洁。 第三种方法是使用特定于产品的函数 EQUAL_NULL。