Що це за оператор <=> в MySQL?


163

Я працюю над кодом, написаним попереднім розробником, і в запиті написано:

WHERE p.name <=> NULL

Що <=>означає цей запит? Це щось рівнозначне =? Або це синтаксична помилка?

Але це не відображає жодних помилок чи винятків. Я вже знаю, що <>= !=в MySQL .


19
spaceshipоператор
Мох всемогутній верблюд

4
@ Mhd.Tahawi, нам потрібен google, який дозволяє нам переглядати Google для операторів безпосередньо.
Pacerier

@Pacerier - я знайшов це, десь 5 років тому symbolhound.com (не знаю, якщо є краща альтернатива)
Ендрю

Відповіді:


239

TL; DR

Це NULLбезпечний рівний оператор.

Як і у звичайного =оператора, порівнюються два значення, і результат є 0(не рівним) або 1(рівним); іншими словами: 'a' <=> 'b'врожайність 0і 'a' <=> 'a'врожайність 1.

На відміну від звичайного =оператора, значення NULLне мають особливого значення, тому воно ніколи не дає NULLможливого результату; так: 'a' <=> NULLврожайність 0і NULL <=> NULLврожайність 1.

Корисність

Це може бути корисним, коли обидва операнди можуть містити NULLі вам потрібен послідовний результат порівняння між двома стовпцями.

Інший випадок використання - це підготовлені заяви, наприклад:

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

Тут заповнювач заповнення може бути скалярним значенням або NULLбез необхідності нічого змінювати запит.

Пов'язані оператори

Крім того <=>, є також два інших оператори, які можна використовувати для порівняння NULL, а саме IS NULLі IS NOT NULL; вони є частиною стандарту ANSI і тому підтримуються в інших базах даних, на відміну від <=>, що є MySQL.

Ви можете вважати їх спеціалізаціями MySQL <=>:

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

Виходячи з цього, ваш конкретний запит (фрагмент) можна перетворити на більш портативний:

WHERE p.name IS NULL

Підтримка

Стандарт SQL: 2003 для цього ввів предикат, який працює точно так само, як <=>оператор MySQL , у такій формі:

IS [NOT] DISTINCT FROM 

Нижче наведено загальну підтримку, але є відносно складною:

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

2
значить, різниці немає? а це <=>дещо марний оператор? правильно?
zzlalani

16
@zzlalani Зовсім не; <=>приймає два операнди, тоді як IS (NOT) NULLлише один; велика різниця ... вона настільки ж корисна, як і =сама в цьому відношенні.
Як

12
@zzlalani IS NULLі IS NOT NULLвходять у стандарт SQL. <=>є специфічним розширенням MySQL.
Даніель Дінніс

5
Так, як is not distinct fromоператор. Цікаво дізнатися, чи може MySQL використовувати індекс про це ...
Денис де Бернарді

3
@Pacerier Ні, зворотна a <=> bє NOT(a <=> b).
Ja͢ck

57

є <=> NULL-safe equal to operator

Цей оператор виконує порівняння рівності, як оператор =, але повертає 1, а не NULL, якщо обидва операнди NULL, і 0, а не NULL, якщо один операнд NULL.

Дивіться тут документацію

Зразок:

ви повинні використовувати НЕ НУЛЬНИЙ. (Оператори порівняння = і <> дають НЕЗНАЧЕНО з NULL з обох боків виразу.)

SELECT * 
FROM table 
WHERE YourColumn IS NOT NULL;

також може заперечити нульовий безпечний оператор рівності, але це не стандартний SQL.

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

1
Виправлення: <=>слід називати оператором рівних і =є NULLнебезпечним оператором рівних.
Pacerier

26

Це безпечний для NULL рівний оператору

<=> Оператор використовується для порівняння значень NULL з полями. Якщо нормально = (дорівнює) Оператори повертають NULL, якщо одним із значень порівняння є NULL. З <=> оператор повертає істинне або хибне. <=> Оператор такий же, як IS NULL.

З посібника: -

<=> виконує порівняння рівності, як оператор =, але повертає 1, а не NULL, якщо обидва операнди NULL, і 0, а не NULL, якщо один операнд NULL.

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

Edit: - ( Хоча дуже пізно , щоб додати одну важливу побічну зауваження згадати НЕ <=> а )

Зі сторони: -

НЕ <=>

Є ще один пункт NOT <=>, який використовується для порівняння значень NULL з полями. Якщо нормально! = Або <> (не дорівнює) Оператори повертають NULL, якщо одним із значень порівняння є NULL. Якщо НЕ застосовується до <=>, оператор повертає значення true чи false. НЕ застосовується до <=> Оператор такий самий, як НЕ НУЛЬНИЙ.

Приклад: -

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

1
NOT <=>не є оператором, він NOTзастосовується до результату op1 <=> op2.
Ja͢ck

@Jack: - Так, ти прав. Оновлена ​​відповідь! Додав це так, щоб
задуматися

Тож я думаю, що <!=>оператора немає
Кіп

@kip: ні, нема!
Рахул Трипаті

18

<=>є безпечним для оператора "рівним" MySQL. З посібника :

NULL-безпечний рівний. Цей оператор виконує порівняння рівності, як оператор =, але повертає 1, а не NULL, якщо обидва операнди NULL, і 0, а не NULL, якщо один операнд NULL.

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

11

NULL-безпечний рівний. Цей оператор виконує порівняння рівності, як оператор =, але повертає 1, а не NULL, якщо обидва операнди NULL, і 0, а не NULL, якщо один операнд NULL.

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

Це значення:

Якщо порівнювати значення NULL з значенням NULL, ви отримаєте NULL. Якщо ви хочете перевірити, чи є значення нульовим.

Оператор рівності (<=>), який розглядає NULL як нормальне значення, тому він повертає 1 (не NULL), якщо обидва значення NULL, і повертає 0 (не NULL), якщо одне із значень NULL:

напр

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

10

<=>є рівним оператором, безпечним для NULL . a <=> bте саме, що писати:

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

І вибачте, я не зміг знайти жодної вагомої причини використовувати цей оператор замість AND/OR IS (NOT) NULL. Ваш приклад, наприклад, WHERE p.name <=> NULLтакий же, як WHERE p.name IS NULL.


9

З документації на MySQL :

NULL-безпечний рівний. Цей оператор виконує порівняння рівності, як оператор =, але повертає 1, а не NULL, якщо обидва операнди NULL, і 0, а не NULL, якщо один операнд NULL.

Приклад використання <=>оператора:

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

Що поверне:

1, 1, 0

Прикладом звичайного =оператора є:

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

Що поверне:

1, NULL, NULL

<=>Оператор дуже схожий на =оператор, за винятком того, <=>ніколи не повернусяNULL



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 |
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.