174 votes

Qu'est-ce que cet opérateur <=> dans MySQL ?

Je travaille sur un code écrit par un ancien développeur et dans une requête il est dit,

WHERE p.name <=> NULL

Qu'est-ce que <=> dans cette requête ? Est-ce quelque chose d'égal à = ? Ou s'agit-il d'une erreur de syntaxe ?

Mais il ne montre aucune erreur ou exception. Je sais déjà que <> = != sur MySQL .

22 votes

Le site spaceship opérateur

4 votes

@Mhd.Tahawi, Nous besoin de un google qui nous permet de rechercher des opérateurs directement sur google.

1 votes

@Pacerier - J'ai trouvé ceci, il y a environ 5 ans. symbolhound.com (je ne sais pas s'il y a une meilleure alternative)

255voto

Jack Points 88446

TL;DR

C'est le NULL sûrs et égaux opérateur.

Comme l'ordinaire = l'opérateur, deux valeurs sont comparées et le résultat est soit 0 (non égal) ou 1 (égal) ; en d'autres termes : 'a' <=> 'b' donne 0 et 'a' <=> 'a' donne 1 .

Contrairement à l'ordinaire = les valeurs de l'opérateur NULL n'ont pas de signification particulière et ne donnent donc jamais de résultats NULL comme un résultat possible ; donc : 'a' <=> NULL donne 0 et NULL <=> NULL donne 1 .

Utilité

Cela peut s'avérer utile lorsque les deux opérandes peuvent contenir NULL et vous avez besoin d'un résultat de comparaison cohérent entre deux colonnes.

Un autre cas d'utilisation est celui des déclarations préparées, par exemple :

... WHERE col_a <=> ? ...

Ici, le caractère de remplacement peut être une valeur scalaire ou NULL sans avoir à modifier quoi que ce soit dans la requête.

Opérateurs connexes

Outre <=> il existe également deux autres opérateurs qui peuvent être utilisés pour effectuer des comparaisons. NULL à savoir IS NULL et IS NOT NULL ; ils font partie de la norme ANSI et sont donc supportés par d'autres bases de données, contrairement à <=> qui est spécifique à MySQL.

Vous pouvez les considérer comme des spécialisations de l'outil MySQL <=> :

'a' IS NULL     ==> 'a' <=> NULL
'a' IS NOT NULL ==> NOT('a' <=> NULL)

Sur cette base, votre requête particulière (fragment) peut être convertie en une requête plus portable :

WHERE p.name IS NULL

Soutien

La norme SQL:2003 a introduit un prédicat pour cela, qui fonctionne exactement comme le prédicat MySQL <=> sous la forme suivante :

IS [NOT] DISTINCT FROM 

Ce qui suit est universellement soutenu, mais est relativement complexe :

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

0 votes

Alors quelle est l'utilité de IS NULL et IS NOT NULL ? ?

2 votes

Donc cela signifie qu'il n'y a pas de différence ? et ceci <=> est en quelque sorte un opérateur inutile ? non ?

16 votes

@zzlalani Pas du tout ; <=> prend deux opérandes alors que IS (NOT) NULL Il suffit d'un seul ; grand différence ... c'est aussi utile que = à cet égard.

59voto

Drixson Oseña Points 2038

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 un opérande est NULL.

Voir ici pour le documentation

Echantillon :

vous devez utiliser IS NOT NULL. (Les opérateurs de comparaison = et <> donnent tous deux UNKNOWN avec NULL de chaque côté de l'expression).

SELECT * 
FROM table 
WHERE YourColumn IS NOT NULL;

peut également annuler l'opérateur d'égalité null safe, mais ce n'est pas un standard SQL.

SELECT *
FROM table 
WHERE NOT (YourColumn <=> NULL);

2 votes

Correction : <=> devrait être appelé le opérateur égal et = est le NULL opérateur d'égalité non sécurisé.

29voto

Rahul Tripathi Points 1

C'est le Opérateur égal à NULL-safe

L'opérateur <=> est utilisé pour comparer les valeurs NULL avec les champs. Si l'opérateur =(equals) normal renvoie 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.

Extrait du manuel : -

<=> effectue une comparaison d'égalité comme l'opérateur =, mais retourne 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.

mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
        -> 1, 1, 0
mysql> SELECT 1 = 1, NULL = NULL, 1 = NULL;
        -> 1, NULL, NULL

Edit:- ( Bien qu'il soit très tard pour ajouter une note latérale importante mentionnant PAS <=> également )

D'ailleurs, il faut savoir que

PAS <=>

Il y a un autre point PAS <=> qui est utilisé pour comparer les valeurs NULL avec les champs. Si les opérateurs normaux != ou <> (non égaux) renvoient NULL si l'une des valeurs de comparaison est NULL. Avec NOT appliqué à l'opérateur <=>, il renvoie true ou false. NOT appliqué à l'opérateur <=> est identique à IS NOT NULL.

Exemple:-

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

1 votes

NOT <=> n'est pas un opérateur, c'est NOT appliqué au résultat de op1 <=> op2 .

0 votes

@Jack:- Oui, vous avez raison. J'ai mis à jour la réponse ! J'ai ajouté cela pour marquer un point :)

0 votes

Donc je suppose qu'il n'y a pas <!=> opérateur

18voto

Ed Cottrell Points 11100

<=> est l'opérateur "égal à" à sécurité nulle de MySQL. Extrait du manuel :

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 un opérande est NULL.

mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
        -> 1, 1, 0
mysql> SELECT 1 = 1, NULL = NULL, 1 = NULL;
        -> 1, NULL, NULL

13voto

Nagaraj S Points 4869

Se référer à l'entrée manuelle pour <=> :

Égalité à sécurité NULL. Cet opérateur effectue une comparaison d'égalité comme l'opérateur =, mais renvoie 1 au lieu de NULL si les deux opérandes sont NULL et 0 au lieu de 0 au lieu de NULL si l'un des opérandes est NULL.


 SELECT 1 <=> 1  -------------->result is 1
 SELECT NULL <=> NULL  -------->result is 1
 SELECT 1 <=> NULL  ----------->result is 0

 SELECT 1 = 1,  --------------->result is 1
 SELECT NULL = NULL  ---------->result is NULL
 SELECT 1 = NULL  ------------->result is NULL

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X