TL; DR
Đó là NULL
an toàn bình đẳng
nhà điều hành.
Giống như =
thông thường toán tử, hai giá trị được so sánh và kết quả là 0
(không bằng) hoặc 1
(bình đẳng); nói cách khác:'a' <=> 'b'
sản lượng 0
và 'a' <=> 'a'
sản lượng 1
.
Không giống như =
thông thường toán tử, các giá trị của NULL
không có ý nghĩa đặc biệt và vì vậy nó không bao giờ tạo ra NULL
như một kết quả có thể xảy ra; vì vậy:'a' <=> NULL
sản lượng 0
và NULL <=> NULL
sản lượng 1
.
Tính hữu ích
Điều này có thể hữu ích khi cả hai toán hạng có thể chứa NULL
và bạn cần một kết quả so sánh nhất quán giữa hai cột.
Một trường hợp sử dụng khác là với các câu lệnh được chuẩn bị sẵn, ví dụ:
... WHERE col_a <=> ? ...
Ở đây, trình giữ chỗ có thể là một giá trị vô hướng hoặc NULL
mà không cần phải thay đổi bất kỳ điều gì về truy vấn.
Các toán tử liên quan
Bên cạnh đó <=>
cũng có hai toán tử khác có thể được sử dụng để so sánh với NULL
, cụ thể là IS NULL
và IS NOT NULL
; chúng là một phần của tiêu chuẩn ANSI và do đó được hỗ trợ trên các cơ sở dữ liệu khác, không giống như <=>
, dành riêng cho MySQL.
Bạn có thể coi chúng là các chuyên ngành của <=>
của MySQL :
'a' IS NULL ==> 'a' <=> NULL
'a' IS NOT NULL ==> NOT('a' <=> NULL)
Dựa trên điều này, truy vấn (phân đoạn) cụ thể của bạn có thể được chuyển đổi thành truy vấn di động hơn:
WHERE p.name IS NULL
Hỗ trợ
Tiêu chuẩn SQL:2003 đã giới thiệu một vị từ cho điều này, hoạt động chính xác giống như <=>
của MySQL toán tử, ở dạng sau:
IS [NOT] DISTINCT FROM
Phần sau được hỗ trợ trên toàn cầu, nhưng tương đối phức tạp:
CASE WHEN (a = b) or (a IS NULL AND b IS NULL)
THEN 1
ELSE 0
END = 1