Je travaille sur du code écrit par un développeur précédent et dans une requête il dit,
WHERE p.name <=> NULL
Que <=>
signifie cette requête? Est-ce quelque chose d'égal à =
? Ou est-ce une erreur de syntaxe?
Mais il ne montre aucune erreur ou exception. Je sais déjà que <>
= !=
dans MySQL .
mysql
sql
operators
spaceship-operator
zzlalani
la source
la source
spaceship
opérateurRéponses:
TL; DR
C'est l' opérateur
NULL
égal sûr .Comme l'
=
opérateur régulier , deux valeurs sont comparées et le résultat est soit0
(différent) soit1
(égal); en d'autres termes:'a' <=> 'b'
rendements0
et'a' <=> 'a'
rendements1
.Contrairement à l'
=
opérateur régulier , les valeurs deNULL
n'ont pas de signification particulière et ne donnent donc jamaisNULL
de résultat possible; donc:'a' <=> NULL
rendements0
etNULL <=> NULL
rendements1
.Utilité
Cela peut être utile lorsque les deux opérandes peuvent contenir
NULL
et que vous avez besoin d'un résultat de comparaison cohérent entre deux colonnes.Un autre cas d'utilisation concerne les instructions préparées, par exemple:
Ici, l'espace réservé peut être une valeur scalaire ou
NULL
sans avoir à modifier quoi que ce soit dans la requête.Opérateurs associés
En outre,
<=>
il existe également deux autres opérateurs qui peuvent être utilisés pour comparerNULL
, à savoirIS NULL
etIS NOT NULL
; ils font partie de la norme ANSI et sont donc pris en charge sur d'autres bases de données, contrairement à<=>
ce qui est spécifique à MySQL.Vous pouvez les considérer comme des spécialisations de MySQL
<=>
:Sur cette base, votre requête particulière (fragment) peut être convertie en la plus portable:
Soutien
La norme SQL: 2003 a introduit un prédicat pour cela, qui fonctionne exactement comme l'
<=>
opérateur de MySQL , sous la forme suivante:Ce qui suit est universellement pris en charge, mais est relativement complexe:
la source
<=>
un peu un opérateur inutile? droite?<=>
prend deux opérandes alors qu'ilIS (NOT) NULL
n'en prend qu'un; grande différence ... c'est aussi utile que=
lui-même à cet égard.IS NULL
etIS NOT NULL
sont dans le standard SQL.<=>
est une extension spécifique à MySQL.is not distinct from
opérateur. Curieux de savoir si MySQL peut utiliser un index là-dessus ...a <=> b
estNOT(a <=> b)
.est <=>
NULL-safe equal to operator
Cet opérateur effectue une comparaison d'égalité comme l'opérateur =, mais renvoie 1 plutôt que NULL si les deux opérandes sont NULL et 0 plutôt que NULL si l'un des opérandes est NULL.
Voir ici pour la documentation
Échantillon :
vous devez utiliser IS NOT NULL. (Les opérateurs de comparaison = et <> donnent tous deux INCONNU avec NULL de chaque côté de l'expression.)
peut également annuler l'opérateur d'égalité sûre nul mais ce n'est pas du SQL standard.
la source
<=>
devrait être appelé l' opérateur égal et=
est l'NULL
opérateur égal unsafe.C'est le NULL-safe égal à l'opérateur
<=> L'opérateur est utilisé pour comparer les valeurs NULL avec les champs. Si normal = (égal) Les opérateurs renvoient NULL si l'une des valeurs de comparaison est NULL. Avec <=>, l'opérateur renvoie vrai ou faux. <=> L'opérateur est identique à IS NULL.
À partir du manuel: -
Edit: - ( Bien que très tard pour ajouter une note latérale importante mentionnant PAS <=> également )
Sur une note latérale: -
PAS <=>
Il y a un autre point NOT <=> qui est utilisé pour comparer les valeurs NULL avec les champs. Si normal! = Ou <> (différent de) Les opérateurs renvoient NULL si l'une des valeurs de comparaison est NULL. Avec NOT appliqué à <=>, l'opérateur renvoie vrai ou faux. NOT appliqué à <=> Operator est identique à IS NOT NULL.
Exemple:-
la source
NOT <=>
n'est pas un opérateur, il estNOT
appliqué au résultat deop1 <=> op2
.<!=>
opérateur<=>
est l'opérateur "égal à" de MySQL sans aucun contrôle. À partir du manuel :la source
NULL-safe égal. Cet opérateur effectue une comparaison d'égalité comme l'opérateur =, mais renvoie 1 plutôt que NULL si les deux opérandes sont NULL et 0 plutôt que NULL si l'un des opérandes est NULL.
Cela signifie:
Lorsque vous comparez une valeur NULL avec une valeur non NULL, vous obtenez NULL. Si vous souhaitez vérifier si une valeur est nulle.
L'opérateur d'égalité (<=>) qui considère NULL comme une valeur normale, donc il renvoie 1 (pas NULL) si les deux valeurs sont NULL et retourne 0 (et non NULL) si l'une des valeurs est NULL:
par exemple
la source
<=>
est l' opérateur égal de sécurité NULL .a <=> b
équivaut à écrire:Et désolé, je n'ai pas trouvé une seule bonne raison d'utiliser cet opérateur à la place de
AND/OR IS (NOT) NULL
. Votre exemple, par exemple,WHERE p.name <=> NULL
est le même queWHERE p.name IS NULL
.la source
De la documentation MySQL :
Un exemple utilisant l'
<=>
opérateur serait:Ce qui reviendrait:
Un exemple de l'
=
opérateur régulier serait:Ce qui reviendrait:
L'
<=>
opérateur est très similaire à l'=
opérateur, sauf<=>
qu'il ne retournera jamaisNULL
la source
Il s'agit de l'opérateur NULL - Safe Equal to. Vérifiez la description .
la source
la source