Apa operator ini <=> di MySQL?

163

Saya sedang mengerjakan kode yang ditulis oleh pengembang sebelumnya dan dalam kueri tertulis,

WHERE p.name <=> NULL

Apa <=>artinya dalam permintaan ini? Apakah itu setara dengan =? Atau apakah itu kesalahan sintaksis?

Tetapi tidak menunjukkan kesalahan atau pengecualian. Saya sudah tahu itu <>= !=di MySQL .

zzlalani
sumber
19
yang spaceshipOperator
Moha Mahakuasa unta
4
@ Mhd.Tahawi, Kami membutuhkan google yang memungkinkan kami untuk google untuk operator secara langsung.
Pacerier
@ Peracerier - saya menemukan ini, sekitar 5 tahun yang lalu symbolhound.com (tidak tahu apakah ada alternatif yang lebih baik)
Andrew

Jawaban:

239

TL; DR

Itu adalah operator yang NULLsetara dan aman .

Seperti =operator reguler , dua nilai dibandingkan dan hasilnya adalah 0(tidak sama) atau 1(sama); dengan kata lain: 'a' <=> 'b'hasil 0dan 'a' <=> 'a'hasil 1.

Tidak seperti =operator reguler , nilai-nilai NULLtidak memiliki arti khusus dan karenanya tidak pernah menghasilkan NULLsebagai hasil yang mungkin; jadi: 'a' <=> NULLhasil 0dan NULL <=> NULLhasil 1.

Kegunaan

Ini bisa berguna ketika kedua operan mungkin mengandung NULLdan Anda membutuhkan hasil perbandingan yang konsisten antara dua kolom.

Kasus penggunaan lain adalah dengan pernyataan yang disiapkan, misalnya:

... WHERE col_a <=> ? ...

Di sini, placeholder dapat berupa nilai skalar atau NULLtanpa harus mengubah apa pun tentang kueri.

Operator terkait

Selain itu <=>ada juga dua operator lain yang bisa digunakan untuk membandingkan NULL, yaitu IS NULLdan IS NOT NULL; mereka adalah bagian dari standar ANSI dan karenanya didukung pada database lain, tidak seperti <=>, yang khusus untuk MySQL.

Anda dapat menganggapnya sebagai spesialisasi MySQL <=>:

'a' IS NULL     ==> 'a' <=> NULL
'a' IS NOT NULL ==> NOT('a' <=> NULL)

Berdasarkan ini, kueri khusus Anda (fragmen) dapat dikonversi ke yang lebih portabel:

WHERE p.name IS NULL

Dukung

Standar SQL: 2003 memperkenalkan predikat untuk ini, yang berfungsi persis seperti <=>operator MySQL , dalam bentuk berikut:

IS [NOT] DISTINCT FROM 

Berikut ini didukung secara universal, tetapi relatif kompleks:

CASE WHEN (a = b) or (a IS NULL AND b IS NULL)
     THEN 1
     ELSE 0
END = 1
Mendongkrak
sumber
2
jadi artinya tidak ada perbedaan? dan ini <=>agak operator yang tidak berguna? Baik?
zzlalani
16
@zzlalani Tidak sama sekali; <=>membutuhkan dua operan sedangkan IS (NOT) NULLhanya membutuhkan satu; perbedaan besar ... itu sama berguna dengan =dirinya sendiri dalam hal itu.
Ja͢ck
12
@zzlalani IS NULLdan IS NOT NULLberada dalam standar SQL. <=>adalah ekstensi spesifik MySQL.
Daniel Dinnyes
5
Jadi, seperti is not distinct fromoperator. Penasaran ingin tahu apakah MySQL dapat menggunakan indeks pada ...
Denis de Bernardy
3
@Pacerier Tidak, kebalikannya a <=> badalah NOT(a <=> b).
Ja͢ck
57

adalah <=> NULL-safe equal to operator

Operator ini melakukan perbandingan kesetaraan seperti operator =, tetapi mengembalikan 1 daripada NULL jika kedua operan NULL, dan 0 daripada NULL jika satu operan adalah NULL.

Lihat di sini untuk dokumentasi

Sampel :

Anda harus menggunakan IS NOT NULL. (Operator perbandingan = dan <> keduanya memberikan TIDAK DIKENALKAN dengan NULL di kedua sisi ekspresi.)

SELECT * 
FROM table 
WHERE YourColumn IS NOT NULL;

juga dapat meniadakan operator kesetaraan nol aman tetapi ini bukan SQL standar.

SELECT *
FROM table 
WHERE NOT (YourColumn <=> NULL);
Drixson Oseña
sumber
1
Koreksi: <=>harus disebut Operator equals dan =adalah NULLoperator yang sama dengan tidak aman.
Pacerier
26

Ini adalah NULL-safe sama dengan operator

<=> Operator digunakan untuk membandingkan nilai NULL dengan bidang. Jika normal = (sama dengan) Operator mengembalikan NULL jika salah satu nilai perbandingannya NULL. Dengan <=> operator mengembalikan benar atau salah. <=> Operator sama dengan IS NULL.

Dari manual: -

<=> melakukan perbandingan kesetaraan seperti operator =, tetapi mengembalikan 1 daripada NULL jika kedua operan NULL, dan 0 daripada NULL jika satu operan adalah NULL.

mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
        -> 1, 1, 0
mysql> SELECT 1 = 1, NULL = NULL, 1 = NULL;
        -> 1, NULL, NULL

Sunting: - ( Meskipun sangat terlambat untuk menambahkan satu catatan penting yang menyebutkan TIDAK <=> juga )

Di samping catatan: -

TIDAK <=>

Ada satu lagi poin BUKAN <=> yang digunakan untuk membandingkan nilai NULL dengan bidang. Jika normal! = Atau <> (tidak sama) Operator mengembalikan NULL jika salah satu nilai perbandingannya NULL. Dengan TIDAK diterapkan pada <=> operator mengembalikan benar atau salah. TIDAK diterapkan pada <=> Operator sama dengan IS NOT NULL.

Contoh:-

SELECT NULL != NULL,         //--Result is NULL
   NOT NULL <=> NULL,        //--Result is 0
   NULL IS NOT NULL;         //--Result is 0
Rahul Tripathi
sumber
1
NOT <=>bukan operator, ini NOTditerapkan pada hasil op1 <=> op2.
Ja͢ck
@ Jack: - Ya, Anda benar. Diperbarui jawabannya! Menambahkan hal itu untuk menyampaikan maksud :)
Rahul Tripathi
Jadi saya kira tidak ada <!=>operator
Kip
@ip: tidak ada!
Rahul Tripathi
18

<=>adalah operator "sama dengan" null-safe MySQL. Dari manual :

NULL-safe sama. Operator ini melakukan perbandingan kesetaraan seperti operator =, tetapi mengembalikan 1 daripada NULL jika kedua operan NULL, dan 0 daripada NULL jika satu operan adalah NULL.

mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
        -> 1, 1, 0
mysql> SELECT 1 = 1, NULL = NULL, 1 = NULL;
        -> 1, NULL, NULL
elixenide
sumber
11

NULL-safe sama. Operator ini melakukan perbandingan kesetaraan seperti operator =, tetapi mengembalikan 1 daripada NULL jika kedua operan NULL, dan 0 daripada NULL jika satu operan adalah NULL.

mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
        -> 1, 1, 0
mysql> SELECT 1 = 1, NULL = NULL, 1 = NULL;
        -> 1, NULL, NULL

Itu penting:

Ketika Anda membandingkan nilai NULL dengan nilai non-NULL, Anda akan mendapatkan NULL. Jika Anda ingin memeriksa apakah suatu nilai nol.

Operator Kesetaraan (<=>) yang menganggap NULL sebagai nilai normal, sehingga mengembalikan 1 (bukan NULL) jika kedua nilai NULL dan mengembalikan 0 (bukan NULL) jika salah satu nilainya adalah NULL:

misalnya

 SELECT NULL <=> NULL -- 1
 SELECT TRUE <=> TRUE -- 1
 SELECT col1 <=> col2 FROM myTable
Dimag Kharab
sumber
10

<=>adalah operator yang setara dengan NULL-safe . a <=> bsama seperti menulis:

CASE
    WHEN a IS NULL AND b IS NULL THEN 1 -- both operands null then 1
    WHEN a IS NULL OR  b IS NULL THEN 0 -- one operand is null then 0
    ELSE a = b                          -- else behave like normal = operator
END

Dan maaf, saya tidak dapat menemukan satu alasan bagus untuk menggunakan operator ini AND/OR IS (NOT) NULL. Contoh Anda misalnya, WHERE p.name <=> NULLsama dengan WHERE p.name IS NULL.

Salman A
sumber
9

Dari dokumentasi MySQL :

NULL-safe sama. Operator ini melakukan perbandingan kesetaraan seperti operator =, tetapi mengembalikan 1 daripada NULL jika kedua operan NULL, dan 0 daripada NULL jika satu operan adalah NULL.

Contoh menggunakan <=>operator adalah:

SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;

Yang akan kembali:

1, 1, 0

Contoh =operator reguler adalah:

SELECT 1 = 1, NULL = NULL, 1 = NULL;

Yang akan kembali:

1, NULL, NULL

The <=>operator adalah sangat mirip dengan =operator, kecuali <=>tidak akan pernah kembaliNULL

Jojodmo
sumber
5

Ini adalah NULL - Aman Sama dengan operator. Periksa deskripsi .

MusicLovingIndianGirl
sumber
1
mysql> SELECT * FROM t JOIN t2 WHERE t2.ids = t.ids;
+----+------+----+------+
| id | ids  | id | ids  |
+----+------+----+------+
|  1 |    1 |  1 |    1 |
|  2 |    2 |  2 |    2 |
|  5 |    6 |  5 |    6 |
|  6 |    7 |  6 |    7 |
+----+------+----+------+
4 rows in set (0.00 sec)

mysql> SELECT * FROM t JOIN t2 WHERE t2.ids <=> t.ids;
+----+------+----+------+
| id | ids  | id | ids  |
+----+------+----+------+
|  1 |    1 |  1 |    1 |
|  2 |    2 |  2 |    2 |
|  3 | NULL |  3 | NULL |
|  4 | NULL |  3 | NULL |
|  3 | NULL |  4 | NULL |
|  4 | NULL |  4 | NULL |
|  5 |    6 |  5 |    6 |
|  6 |    7 |  6 |    7 |
zloctb
sumber