Oracle

為什麼我不能在連接中使用空值?

  • September 23, 2019

我已經通過使用…解決了查詢問題row_number() over (partition by……這是一個更普遍的問題,關於為什麼我們不能在連接中使用具有空值的列。為什麼為了連接而 null 不能等於 null?

為什麼為了連接而 null 不能等於 null?

只需告訴 Oracle 這樣做:

select *
from one t1 
 join two t2 on coalesce(t1.id, -1) = coalesce(t2.id, -1);

(請注意,在標準 SQL 中,您可以使用t1.id is not distinct from t2.id獲取空安全相等運算符,但 Oracle 不支持)

但這僅在替換值(上例中的 -1)實際上未出現在表中時才有效。為數字找到這樣一個“神奇”值可能是可能的,但對於字元值將非常困難(尤其是因為 Oracle 也處理空字元串null

另外:不會使用列上的索引(儘管id可以使用表達式定義基於函式的索引)。coalesce()

另一個適用於所有類型的選項,沒有魔法值:

             on t1.id = t2.id or (t1.id is null and t2.id is null)

但真正的問題是:這有意義嗎?

考慮以下範例數據:

表一

id
----
1
2
(null)
(null)

表二

id
----
1
2
(null)
(null)
(null)

在連接中應該選擇哪個空值組合?我上面的範例將導致所有空值的交叉連接。

T1_ID  | T2_ID 
-------+-------
    1 |      1
    2 |      2
(null) | (null)
(null) | (null)
(null) | (null)
(null) | (null)
(null) | (null)
(null) | (null)

引用自:https://dba.stackexchange.com/questions/165798