MySQL'de bu operatör <=> nedir?


163

Önceki bir geliştirici tarafından yazılmış kod üzerinde çalışıyorum ve diyor bir sorguda,

WHERE p.name <=> NULL

<=>Bu sorguda ne anlama geliyor? Eşit bir şey =mi? Yoksa sözdizimi hatası mı?

Ancak herhangi bir hata veya istisna göstermiyor. Ben zaten biliyorum <>= !=içinde MySQL .


19
spaceshipOperatör
MoHA Yüce deve

4
@ Mhd.Tahawi, Operatörler için doğrudan Google'ı kullanmamıza izin veren bir Google'a ihtiyacımız var .
Pacerier

@Pacerier - 5 yıl önce bunu buldum symbolhound.com (daha iyi bir alternatif varsa bilmiyorum)
Andrew

Yanıtlar:


239

TL; DR

Bu var NULLgüvenli eşit operatörü.

Normal =operatör gibi, iki değer karşılaştırılır ve sonuç ya 0eşittir 1(eşit değildir) ya da (eşittir); diğer bir deyişle: 'a' <=> 'b'verim 0ve 'a' <=> 'a'verim 1.

Normal =operatörün aksine , değerlerin NULLözel bir anlamı yoktur ve bu nedenle asla NULLolası bir sonuç olarak ortaya çıkmaz ; yani: 'a' <=> NULLverim 0ve NULL <=> NULLverim 1.

kullanışlılık

Bu, her iki işlenen de içerebilir NULLve iki sütun arasında tutarlı bir karşılaştırma sonucuna ihtiyacınız olduğunda faydalı olabilir .

Başka bir kullanım örneği hazırlanmış ifadelerle, örneğin:

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

Burada yer tutucu, skaler bir değer olabilir veya NULLsorgu hakkında herhangi bir değişiklik yapmak zorunda kalmayabilir.

İlgili operatörler

Bunun yanı sıra <=>karşılaştırmak için kullanılabilecek iki diğer operatörler de bulunmaktadır NULL, yani, IS NULLve IS NOT NULL; bunlar ANSI standardının bir parçasıdır ve bu nedenle <=>MySQL'e özgü diğer veritabanlarında desteklenir .

Bunları MySQL'lerin uzmanlığı olarak düşünebilirsiniz <=>:

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

Buna dayanarak, özel sorgunuz (parça) daha taşınabilir hale dönüştürülebilir:

WHERE p.name IS NULL

Destek

SQL: 2003 standardı, MySQL'in <=>operatörü gibi çalışan bunun için bir önermeyi şu şekilde tanıttı :

IS [NOT] DISTINCT FROM 

Aşağıdakiler evrensel olarak desteklenir, ancak göreceli olarak karmaşıktır:

CASE WHEN (a = b) or (a IS NULL AND b IS NULL)
     THEN 1
     ELSE 0
END = 1

2
yani fark yok demektir? ve bu <=>biraz işe yaramaz bir operatör mü? sağ?
zzlalani

16
@zzlalani Hiç de değil; <=>iki işlenen alırken IS (NOT) NULLyalnızca bir işlenen alır; büyük fark ... bu =bakımdan kendisi kadar faydalı .
Ja͢ck

12
@zzlalani IS NULLve IS NOT NULLSQL standardındadır. <=>MySQL'e özgü bir uzantıdır.
Daniel Dinnyes

5
is not distinct fromOperatör gibi . MySQL'in bu konuda bir endeks kullanıp kullanamayacağını merak ediyorum ...
Denis de Bernardy

3
@Pacerier Hayır, ters a <=> bDİR NOT(a <=> b).
Ja͢ck

57

olduğu <=> NULL-safe equal to operator

Bu işleç = operatörü gibi bir eşitlik karşılaştırması gerçekleştirir, ancak her iki işlenen NULL ise NULL yerine 1, bir işlenen NULL ise NULL yerine 0 döndürür.

Belgeler için buraya bakın

Örneklem :

kullanmalısınız NOT NULL. (Karşılaştırma işleçleri = ve <> ifadenin her ikisi de ifadenin her iki tarafında NULL ile BİLİNMİYOR.)

SELECT * 
FROM table 
WHERE YourColumn IS NOT NULL;

null güvenli eşitlik operatörünü de olumsuz etkileyebilir, ancak bu standart SQL değildir.

SELECT *
FROM table 
WHERE NOT (YourColumn <=> NULL);

1
Düzeltme: <=>çağrılmalıdır eşittir operatörü ve =bir NULLgüvensiz eşittir operatörü.
Pacerier

26

Öyle BOŞ güvenli operatöre eşit

<=> İşleç, NULL değerleri alanlarla karşılaştırmak için kullanılır. Normal ise = (eşittir) Karşılaştırma değerinden biri NULL ise işleçler NULL döndürür. <=> ile operatör doğru veya yanlış döndürür. <=> Operatör IS NULL ile aynı.

Kılavuzdan: -

<=> = operatörü gibi bir eşitlik karşılaştırması gerçekleştirir, ancak her iki işlenen de NULL ise NULL yerine 1 ve bir işlenen NULL ise NULL yerine 0 döndürür.

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

Düzenleme: - ( Her ne kadar NOT <=> da söz önemli bir yan not eklemek için çok geç )

Yan notta: -

DEĞİL <=>

NULL değerlerini alanlarla karşılaştırmak için kullanılan bir NOT <=> noktası daha vardır . Normal ise! = Veya <> (eşit değil) Karşılaştırma değerlerinden biri NULL ise işleçler NULL döndürür. NOT <=> uygulandığında operatör doğru veya yanlış döndürür. DEĞİL <=> İşleci, NOT NOT NULL ile aynıdır.

Misal:-

SELECT NULL != NULL,         //--Result is NULL
   NOT NULL <=> NULL,        //--Result is 0
   NULL IS NOT NULL;         //--Result is 0

1
NOT <=>bir operatör değil NOT, sonucuna uygulanır op1 <=> op2.
Ja͢ck

@Jack: - Evet haklısın. Yanıt güncellendi! Bir noktaya
değinmek

Sanırım <!=>operatör yok
Kip

@kip: hayır yok!
Rahul Tripathi

18

<=>MySQL'in sıfır güvenlikli "eşit" operatörüdür. Kılavuzdan :

NULL-güvenli eşittir. Bu işleç = operatörü gibi bir eşitlik karşılaştırması gerçekleştirir, ancak her iki işlenen NULL ise NULL yerine 1, bir işlenen NULL ise NULL yerine 0 döndürür.

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

11

NULL-güvenli eşittir. Bu işleç = operatörü gibi bir eşitlik karşılaştırması gerçekleştirir, ancak her iki işlenen NULL ise NULL yerine 1, bir işlenen NULL ise NULL yerine 0 döndürür.

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

Önemi:

Bir NULL değerini NULL olmayan bir değerle karşılaştırdığınızda, NULL elde edersiniz. Bir değerin boş olup olmadığını kontrol etmek istiyorsanız.

NULL değerini normal bir değer olarak gören Eşitlik işleci (<=>), bu nedenle her iki değer NULL ise 1 (NULL değil) döndürür ve değerlerden biri NULL ise 0 (NULL değil) döndürür:

Örneğin

 SELECT NULL <=> NULL -- 1
 SELECT TRUE <=> TRUE -- 1
 SELECT col1 <=> col2 FROM myTable

10

<=>bir NULL-kasa eşit operatör . a <=> byazı ile aynı:

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

Ve üzgünüm, bunun yerine bu operatörü kullanmak için iyi bir neden bulamadım AND/OR IS (NOT) NULL. Örneğin, örneğinizle WHERE p.name <=> NULLaynı WHERE p.name IS NULL.


9

Gönderen MySQL belgelerinde :

NULL-güvenli eşittir. Bu işleç = operatörü gibi bir eşitlik karşılaştırması gerçekleştirir, ancak her iki işlenen de NULL ise NULL yerine 1 ve bir işlenen NULL ise NULL yerine 0 döndürür.

İşlecin kullanıldığı bir örnek <=>:

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

Hangi dönecekti:

1, 1, 0

Normal =operatöre örnek olarak şunlar verilebilir:

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

Hangi dönecekti:

1, NULL, NULL

<=>Operatör çok benzer =haricinde operatör <=>asla dönecektirNULL



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 |
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.