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

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

WHERE p.name <=> NULL

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

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

Ответ 1

Сходство с оператором =

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

Разница с оператором =

В отличие от обычного оператора = значения NULL не имеют специального значения и поэтому никогда не дают NULL в качестве возможного результата; поэтому: 'a' <=> NULL дает 0 и NULL <=> NULL дает 1.

В отличие от =, в результате чего 'a' = NULL дает NULL и даже NULL = NULL дает NULL; BTW, почти все операторы и функции в MySQL работают таким образом, потому что сравнение с NULL в основном undefined.

Полезность

Это очень полезно, когда оба операнда могут содержать 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

Ответ 2

- <= > 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);

Ответ 3

Это 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 с полями. Если normal!= Или < > (не равно) Операторы возвращают 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

Ответ 4

<=> - это 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

Ответ 5

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.

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

например,

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

Ответ 6

<=> является 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.

Ответ 7

Из документации 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

Ответ 8

Это оператор NULL - Safe Equal. Проверьте описание.

Ответ 9

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 |