¿Qué es este operador <=> en MySQL?


163

Estoy trabajando en el 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 .


19
el spaceshipoperador
Moha el todopoderoso camello

44
@ Mhd.Tahawi, necesitamos un google que nos permita buscar operadores directamente en google.
Pacerier

@Pacerier - Encontré esto, hace unos 5 años symbolhound.com (no sé si hay una mejor alternativa)
Andrew

Respuestas:


239

TL; DR

Es el operador NULLseguro igual .

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'rendimientos 0y 'a' <=> 'a'rendimientos 1.

A diferencia del =operador regular , los valores de NULLno tienen un significado especial y, por lo tanto, nunca dan NULLcomo resultado posible; entonces: 'a' <=> NULLrendimientos 0y NULL <=> NULLrendimientos 1.

Utilidad

Esto puede ser útil cuando ambos operandos pueden contener NULLy 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 NULLsin tener que cambiar nada sobre la consulta.

Operadores relacionados

Además, <=>también hay otros dos operadores que se pueden usar para comparar NULL, a saber, IS NULLy IS NOT NULL; son parte del estándar ANSI y, por lo tanto, son compatibles con otras bases de datos, a diferencia de <=>MySQL.

Puede 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 particular (fragmento) se puede convertir a la más portátil:

WHERE p.name IS NULL

Apoyo

El estándar SQL: 2003 introdujo un predicado para esto, que funciona exactamente como el <=>operador de MySQL , en la siguiente forma:

IS [NOT] DISTINCT FROM 

Lo siguiente es universalmente compatible, pero es relativamente complejo:

CASE WHEN (a = b) or (a IS NULL AND b IS NULL)
     THEN 1
     ELSE 0
END = 1

2
entonces significa que no hay diferencia? y esto <=>es algo un operador inútil? ¿Derecha?
zzlalani

16
@zzlalani Para nada; <=>toma dos operandos mientras que IS (NOT) NULLsolo toma uno; gran diferencia ... es tan útil como =en sí mismo a ese respecto.
Ja͢ck

12
@zzlalani IS NULLy IS NOT NULLestán en el estándar SQL. <=>es una extensión específica de MySQL.
Daniel Dinnyes

55
Entonces, como el is not distinct fromoperador. Curioso por saber si MySQL puede usar un índice en eso ...
Denis de Bernardy

3
@Pacerier No, el inverso de a <=> bes NOT(a <=> b).
Ja͢ck

57

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.

Ver aquí para la documentación

Muestra:

debe usar IS NOT NULL. (Los operadores de comparación = y <> ambos dan DESCONOCIDO con NULL a cada 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);

1
Corrección: <=>debe llamarse operador igual y =es el NULLoperador igual inseguro.
Pacerier

26

Es el operador NULL-safe igual a

<=> El operador se utiliza para comparar valores NULL con los campos. Si es normal = (igual) Los operadores devuelven NULL si uno de los valores de comparación es NULL. Con <=> el operador devuelve verdadero o falso. <=> El operador es el 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 lateral importante mencionando NO <=> también )

En otros comentarios:-

NO <=>

Hay un punto más NO <=> que se utiliza para comparar valores NULL con los campos. Si es normal! = O <> (no es igual) Los operadores devuelven NULL si uno de los valores de comparación es NULL. Con NO aplicado a <=> el operador devuelve verdadero o falso. NO se aplica a <=> El operador es igual que NO ES NULO.

Ejemplo:-

SELECT NULL != NULL,         //--Result is NULL
   NOT NULL <=> NULL,        //--Result is 0
   NULL IS NOT NULL;         //--Result is 0

1
NOT <=>no es un operador, se NOTaplica al resultado de op1 <=> op2.
Ja͢ck

@ Jack: - Sí, tienes razón. Actualizado la respuesta! Agregó que para hacer un punto :)
Rahul Tripathi

Así que supongo que no hay <!=>operador
Kip

@kip: no, no lo hay!
Rahul Tripathi

18

<=>es el operador "igual a" nulo seguro 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

11

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

Significa:

Cuando compara un valor NULL con un valor no NULL, obtendrá NULL. Si desea verificar si un valor es nulo.

El operador de 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

10

<=>es el operador igual a NULL-safe . a <=> bes 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 <=> NULLes el mismo que WHERE p.name IS NULL.


9

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;

Que volvería:

1, 1, 0

Un ejemplo del =operador regular sería:

SELECT 1 = 1, NULL = NULL, 1 = NULL;

Que volvería:

1, NULL, NULL

El <=>operador es muy similar al =operador, excepto <=>que nunca volveráNULL



1
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 |
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.