SQL"加入"空值

Dan*_*Dan 22 sql oracle null

由于我无法控制的原因,我需要连接两个表,我需要空值来匹配.我能想到的最好的选择是吐出一个UUID并将其用作我的比较值,但它看起来很难看

SELECT * FROM T1 JOIN T2 ON nvl(T1.SOMECOL,'f44087d5935dccbda23f71f3e9beb491') = 
   nvl(T2.SOMECOL,'f44087d5935dccbda23f71f3e9beb491')
Run Code Online (Sandbox Code Playgroud)

我怎么能做得更好?如果重要的话,这在Oracle上,并且上下文是一个应用程序,其中必须将一批用户上载的数据与一批现有数据进行比较,以查看是否有任何行匹配.回想起来,我们应该阻止任一数据集中的任何连接列包含空值,但我们没有,现在我们必须忍受它.

编辑:要清楚,我不仅关注空值.如果列不为null,我希望它们匹配实际值.

Eri*_*lje 42

也许这会奏效,但我从来没有尝试过:

SELECT * 
FROM T1 JOIN T2 
ON T1.SOMECOL = T2.SOMECOL OR (T1.SOMECOL IS NULL AND T2.SOMECOL IS NULL)
Run Code Online (Sandbox Code Playgroud)

  • 它比Dan提出的nvl解决方案要慢得多,特别是当行数增加时. (2认同)

Cad*_*oux 6

在SQL Server中我使用过:

WHERE (a.col = b.col OR COALESCE(a.col, b.col) IS NULL)
Run Code Online (Sandbox Code Playgroud)

显然效率不高,因为OR,但除非有保留值,否则你可以将NULL映射到两边而不会产生歧义或折叠,这是你可以做的最好的(如果有的话,为什么在你的设计中甚至允许使用NULL ... .)


Tam*_*ász 6

在 Oracle 中,您可以使用以下方式连接空值decode

    SELECT * FROM T1 JOIN T2 ON DECODE(T1.SOMECOL, T2.SOMECOL, 1, 0) = 1
Run Code Online (Sandbox Code Playgroud)

decode将空值视为相等,因此无需“魔术”数字即可工作。两列必须具有相同的数据类型。

它不会产生最具可读性的代码,但可能仍然比t1.id = t2.id or (t1.id is null and t2.id is null)