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