Tại sao null không thể bằng null vì lợi ích của việc tham gia?
Chỉ cần nói với Oracle để làm điều đó:
select *
from one t1
join two t2 on coalesce(t1.id, -1) = coalesce(t2.id, -1);
(Lưu ý rằng trong SQL tiêu chuẩn, bạn có thể sử dụng t1.id is not distinct from t2.id
để có được toán tử đẳng thức an toàn null, nhưng Oracle không hỗ trợ điều đó)
Nhưng điều này sẽ chỉ hoạt động nếu giá trị thay thế (-1 trong ví dụ trên) không thực sự xuất hiện trong bảng. Việc tìm kiếm một giá trị "ma thuật" như vậy cho các số có thể là có thể, nhưng sẽ rất khó cho các giá trị ký tự (đặc biệt là vì Oracle cũng xử lý một chuỗi trống null
)
Thêm vào đó: không có chỉ mục nào trên các id
cột sẽ được sử dụng (bạn có thể xác định chỉ mục dựa trên hàm với coalesce()
biểu thức).
Một tùy chọn khác hoạt động cho tất cả các loại, không có giá trị ma thuật:
on t1.id = t2.id or (t1.id is null and t2.id is null)
Nhưng câu hỏi thực sự là: điều này có ý nghĩa?
Xem xét các dữ liệu mẫu sau:
Bảng một
id
----
1
2
(null)
(null)
Bảng hai
id
----
1
2
(null)
(null)
(null)
Sự kết hợp nào của các giá trị null nên được chọn trong phép nối? Ví dụ trên của tôi sẽ dẫn đến kết quả giống như tham gia chéo cho tất cả các giá trị null.
T1_ID | T2_ID
-------+-------
1 | 1
2 | 2
(null) | (null)
(null) | (null)
(null) | (null)
(null) | (null)
(null) | (null)
(null) | (null)
where (a = b or (a is null and b is null))
thời gian. đó là suy nghĩ của tôi về nó. Tôi sẽ không cân nhắc việc sử dụngsys_op_map_nonnull
, bỏ qua người đàn ông đằng sau bức màn. "