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 |