operadores - ¿Qué es este operador<=> en MySQL?
operadores relacionales en mysql (9)
Similitud con =
operador
Al igual que el operador regular =
, se comparan dos valores y el resultado es 0
(no igual) o 1
(igual); en otras palabras: ''a'' <=> ''b''
rinde 0
y ''a'' <=> ''a''
rinde 1
.
Diferencia con =
operador
A diferencia del operador regular =
, los valores de NULL
no tienen un significado especial y, por lo tanto, nunca arrojan NULL
como posible resultado; entonces: ''a'' <=> NULL
rinde 0
y NULL <=> NULL
rinde 1
.
Contrariamente a =
, donde ''a'' = NULL
produce NULL
e incluso NULL = NULL
produce NULL
; Por cierto, casi todos los operadores y funciones en MySQL funcionan de esta manera, porque comparar contra NULL
es básicamente indefinido.
Utilidad
Esto es muy útil para cuando ambos operandos pueden contener NULL
y necesita un resultado de comparación consistente entre dos columnas.
Otro caso de uso es con declaraciones preparadas, por ejemplo:
... WHERE col_a <=> ? ...
Aquí, el marcador de posición puede ser un valor escalar o NULL
sin tener que cambiar nada sobre la consulta.
Operadores relacionados
Además de <=>
también hay otros dos operadores que se pueden usar para comparar con NULL
, es decir, IS NULL
y IS NOT NULL
; son parte del estándar ANSI y, por lo tanto, son compatibles con otras bases de datos, a diferencia de <=>
, que es específico de MySQL.
Puedes pensar en ellos como especializaciones de MySQL <=>
:
''a'' IS NULL ==> ''a'' <=> NULL
''a'' IS NOT NULL ==> NOT(''a'' <=> NULL)
En base a esto, su consulta (fragmento) particular se puede convertir a la más portátil:
WHERE p.name IS NULL
Estoy trabajando en un código escrito por un desarrollador anterior y en una consulta dice:
WHERE p.name <=> NULL
¿Qué significa <=>
en esta consulta? ¿Es algo igual a =
? ¿O es un error de sintaxis?
Pero no muestra ningún error o excepción. Ya sé que <>
= !=
En MySQL .
De la documentación de MySQL :
NULL-safe igual. Este operador realiza una comparación de igualdad como el operador =, pero devuelve 1 en lugar de NULL si ambos operandos son NULL, y 0 en lugar de NULL si un operando es NULL.
Un ejemplo con el operador <=>
sería:
SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
Cuál volvería:
1, 1, 0
Un ejemplo del operador regular =
sería:
SELECT 1 = 1, NULL = NULL, 1 = NULL;
Cuál volvería:
1, NULL, NULL
El operador <=>
es muy similar al operador =
, excepto que <=>
nunca devolverá NULL
<=> El operador se usa para comparar valores NULL con los campos. If normal = (equal) Los operadores devuelven NULL si uno de los valores de comparación es NULL. Con <=> el operador devuelve verdadero o falso. <=> El operador es lo mismo que IS NULL.
Del manual: -
<=>
realiza una comparación de igualdad como el operador =, pero devuelve 1 en lugar de NULL si ambos operandos son NULL y 0 en lugar de NULL si un operando es NULL.
mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
-> 1, 1, 0
mysql> SELECT 1 = 1, NULL = NULL, 1 = NULL;
-> 1, NULL, NULL
Editar: - ( Aunque es muy tarde para agregar una nota al margen importante mencionando NOT <=> también )
En otros comentarios:-
NO <=>
Hay un punto más NO <=> que se usa para comparar valores NULL con los campos. Si es normal! = O <> (no igual) Los operadores devuelven NULL si uno de los valores de comparación es NULL. Con NOT aplicado a <=> el operador devuelve verdadero o falso. NO aplicado a <=> El operador es lo mismo que IS NOT NULL.
Ejemplo:-
SELECT NULL != NULL, //--Result is NULL
NOT NULL <=> NULL, //--Result is 0
NULL IS NOT NULL; //--Result is 0
Es el operador NULL - Safe Equal to. Ver descripción .
NULL-safe igual. Este operador realiza una comparación de igualdad como el operador =, pero devuelve 1 en lugar de NULL si ambos operandos son NULL, y 0 en lugar de NULL si un operando es NULL.
mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
-> 1, 1, 0
mysql> SELECT 1 = 1, NULL = NULL, 1 = NULL;
-> 1, NULL, NULL
Es importante:
Cuando compara un valor NULL con un valor no NULL, obtendrá NULL. Si desea verificar si un valor es nulo.
El operador Igualdad (<=>) que considera NULL como un valor normal, por lo que devuelve 1 (no NULL) si ambos valores son NULL y devuelve 0 (no NULL) si uno de los valores es NULL:
p.ej
SELECT NULL <=> NULL -- 1
SELECT TRUE <=> TRUE -- 1
SELECT col1 <=> col2 FROM myTable
es <=> NULL-safe equal to operator
Este operador realiza una comparación de igualdad como el operador =, pero devuelve 1 en lugar de NULL si ambos operandos son NULL, y 0 en lugar de NULL si un operando es NULL.
Vea aquí para la documentation
Muestra:
deberías usar IS NOT NULL. (Los operadores de comparación = y <> ambos dan DESCONOCIDO con NULO en cualquier lado de la expresión).
SELECT *
FROM table
WHERE YourColumn IS NOT NULL;
también puede negar el operador de igualdad segura nula, pero esto no es SQL estándar.
SELECT *
FROM table
WHERE NOT (YourColumn <=> NULL);
<=>
es el operador igual de NULL-safe . a <=> b
es lo mismo que escribir:
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
Y lo siento, no pude encontrar una buena razón para usar este operador en lugar de AND/OR IS (NOT) NULL
. Su ejemplo, por ejemplo, WHERE p.name <=> NULL
es igual que WHERE p.name IS NULL
.
<=>
es el operador nulo seguro de "igual a" de MySQL. Del manual :
NULL-safe igual. Este operador realiza una comparación de igualdad como el operador =, pero devuelve 1 en lugar de NULL si ambos operandos son NULL, y 0 en lugar de NULL si un operando es NULL.
mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
-> 1, 1, 0
mysql> SELECT 1 = 1, NULL = NULL, 1 = NULL;
-> 1, 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 |