Oracle
為什麼我不能在連接中使用空值?
我已經通過使用…解決了查詢問題
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)