TL; DR
Đó là sự NULL
an toàn như nhau toán tử .
Như thường lệ =
toán tử , hai giá trị được so sánh và kết quả là0
(không bằng) hoặc 1
(bằ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ư =
toán tử thông thường , các giá trị củaNULL
không có ý nghĩa đặc biệt và vì vậy nó không bao giờ mang lạiNULL
kết quả khả dĩ; vì vậy: 'a' <=> NULL
sản lượng 0
và NULL <=> NULL
sản lượng 1
.
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ị, ví dụ:
... WHERE col_a <=> ? ...
Ở đây, trình giữ chỗ có thể là giá trị vô hướng hoặc NULL
không phải thay đổi bất cứ điều gì về truy vấn.
Toán tử liên quan
Ngoài ra <=>
, còn có hai toán tử khác có thể được sử dụng để so sánh với NULL
, đó 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ư<=>
MySQL.
Bạn có thể coi chúng là các chuyên ngành 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 cụ thể của bạn (đoạn) có thể được chuyển đổi sang dễ mang theo hơn:
WHERE p.name IS NULL
Ủng hộ
Tiêu chuẩn SQL: 2003 đã giới thiệu một vị từ cho cái này, hoạt động chính xác như <=>
toán tử của MySQL , ở dạng sau:
IS [NOT] DISTINCT FROM
Sau đây là phổ biến được hỗ trợ, 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
spaceship
điều khiển