由于我无法控制的原因,我需要连接两个表,我需要空值来匹配.我能想到的最好的选择是吐出一个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)
在SQL Server中我使用过:
WHERE (a.col = b.col OR COALESCE(a.col, b.col) IS NULL)
Run Code Online (Sandbox Code Playgroud)
显然效率不高,因为OR,但除非有保留值,否则你可以将NULL映射到两边而不会产生歧义或折叠,这是你可以做的最好的(如果有的话,为什么在你的设计中甚至允许使用NULL ... .)
在 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)
归档时间: |
|
查看次数: |
65457 次 |
最近记录: |