Что это за оператор <=> в 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
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
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