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

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

WHERE p.name <=> NULL

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

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

10 ответов

Решение

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

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

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

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

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

Полезность

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

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

Это 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

<=> является нулевым безопасным оператором 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

<=> 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,

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

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

Это NULL - Безопасный Равный оператору. Проверьте описание.

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 |

Короче говоря, where col1<=>? , это эквивалентно where col1=? or col1 is null

Другие вопросы по тегам