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 .
mysql
sql
operators
spaceship-operator
zzlalani
fuente
fuente
spaceship
operadorRespuestas:
TL; DR
Es el operador
NULL
seguro igual .Al igual que el
=
operador regular , se comparan dos valores y el resultado es0
(no igual) o1
(igual); en otras palabras:'a' <=> 'b'
rendimientos0
y'a' <=> 'a'
rendimientos1
.A diferencia del
=
operador regular , los valores deNULL
no tienen un significado especial y, por lo tanto, nunca danNULL
como resultado posible; entonces:'a' <=> NULL
rendimientos0
yNULL <=> NULL
rendimientos1
.Utilidad
Esto puede ser útil 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:
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,
<=>
también hay otros dos operadores que se pueden usar para compararNULL
, a saber,IS NULL
yIS 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
<=>
:En base a esto, su consulta particular (fragmento) se puede convertir a la más portátil:
Apoyo
El estándar SQL: 2003 introdujo un predicado para esto, que funciona exactamente como el
<=>
operador de MySQL , en la siguiente forma:Lo siguiente es universalmente compatible, pero es relativamente complejo:
fuente
<=>
es algo un operador inútil? ¿Derecha?<=>
toma dos operandos mientras queIS (NOT) NULL
solo toma uno; gran diferencia ... es tan útil como=
en sí mismo a ese respecto.IS NULL
yIS NOT NULL
están en el estándar SQL.<=>
es una extensión específica de MySQL.is not distinct from
operador. Curioso por saber si MySQL puede usar un índice en eso ...a <=> b
esNOT(a <=> b)
.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).
También puede negar el operador de igualdad segura nula, pero esto no es SQL estándar.
fuente
<=>
debe llamarse operador igual y=
es elNULL
operador igual inseguro.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: -
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:-
fuente
NOT <=>
no es un operador, seNOT
aplica al resultado deop1 <=> op2
.<!=>
operador<=>
es el operador "igual a" nulo seguro de MySQL. Del manual :fuente
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.
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
fuente
<=>
es el operador igual a NULL-safe .a <=> b
es lo mismo que escribir: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 el mismo queWHERE p.name IS NULL
.fuente
De la documentación de MySQL :
Un ejemplo con el
<=>
operador sería:Que volvería:
Un ejemplo del
=
operador regular sería:Que volvería:
El
<=>
operador es muy similar al=
operador, excepto<=>
que nunca volveráNULL
fuente
Es el NULL: igual a seguro para el operador. Ver descripción .
fuente
fuente