Что это за оператор <=> в MySQL?

163

Я работаю над кодом, написанным предыдущим разработчиком, и в запросе говорится:

WHERE p.name <=> NULL

Что <=>означает в этом запросе? Это что-то равное =? Или это синтаксическая ошибка?

Но это не показывает никаких ошибок или исключений. Я уже знаю, что <>= !=в MySQL .

zzlalani
источник
19
spaceshipоператор
Мох всемогущий верблюд
4
@ Mhd.Tahawi, нам нужен 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только один; большая разница ... это так же полезно, как =и в этом отношении.
Ja͢ck
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.

Смотрите здесь для документации

Образец :

Вы должны использовать IS NOT NULL. (Операторы сравнения = и <> оба дают UNKNOWN с NULL с обеих сторон выражения.)

SELECT * 
FROM table 
WHERE YourColumn IS NOT NULL;

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

SELECT *
FROM table 
WHERE NOT (YourColumn <=> NULL);
Дриксон Осенья
источник
1
Исправление: <=>должен называться оператором равенства и =является NULLнебезопасным оператором равенства.
Пейсер
26

Это NULL-сейф, равный оператору

<=> Оператор используется для сравнения значений NULL с полями. Если normal = (равно), операторы возвращают NULL, если одно из значений сравнения равно NULL. С помощью оператора <=> возвращает значение true или false. <=> Оператор такой же, как 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

Изменить: - ( Хотя очень поздно, чтобы добавить одну важную заметку с упоминанием НЕ <=> также )

На примечании стороны: -

НЕ <=>

Есть еще одна точка NOT <=>, которая используется для сравнения значений NULL с полями. Если нормально! = Или <> (не равно) Операторы возвращают NULL, если одно из значений сравнения равно NULL. Если оператор НЕ применяется к <=>, оператор возвращает значение true или false. НЕ применяется к <=> оператору так же, как IS NOT NULL.

Пример:-

SELECT NULL != NULL,         //--Result is NULL
   NOT NULL <=> NULL,        //--Result is 0
   NULL IS NOT NULL;         //--Result is 0
Рахул Трипати
источник
1
NOT <=>не оператор, он NOTприменяется к результату op1 <=> op2.
Яцк
@ Джек: - Да, вы правы. Обновил ответ! Добавил это, чтобы сделать точку :)
Рахул Трипати
Так что я думаю, что нет <!=>оператора
Кип
@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
elixenide
источник
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

Jojodmo
источник
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
источник