relacionales operadores operaciones logicos igualdad consultas condiciones con comparación comparacion aritmeticos mysql sql operators spaceship-operator

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


Es NULL-safe igual a operador

<=> 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



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 |