MySQLのこの演算子<=>は何ですか?


163

私は以前の開発者によって書かれたコードに取り組んでおり、クエリでは、

WHERE p.name <=> NULL

<=>このクエリの意味は何ですか?それは等しいもの=ですか?それとも構文エラーですか?

ただし、エラーや例外は表示されていません。MySQLでは<> = !=はすでに知っています


19
spaceshipオペレータ
モハ全能のラクダ

4
@ Mhd.Tahawi、オペレーターを直接グーグルできるグーグルが必要です。
Pacerier、2015

@Pacerier-私はこれを見つけました、5年ほど前にsymbolhound.com(より良い代替案がある場合はdunno
Andrew

回答:


239

TL; DR

それはだNULL、安全等しい演算子。

通常の=演算子と同様に、2つの値が比較され、結果は(等しく0ない)または1(等しい)になります。つまり、'a' <=> 'b'yields 0'a' <=> 'a'yields 1です。

通常の=演算子とは異なり、の値にNULLは特別な意味がないためNULL、可能な結果として得られることはありません。so:'a' <=> NULLyields 0およびNULL <=> NULLyields 1

使いやすさ

これは、両方のオペランドに含まれる可能性がNULLあり、2つの列間で一貫した比較結果が必要な場合に役立ちます。

別の使用例は、準備されたステートメントを使用する場合です。次に例を示します。

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

ここで、プレースホルダーはスカラー値にNULLすることも、クエリについて何も変更する必要がないこともあります。

関連オペレーター

それに加えて、<=>と比較するために使用できる他の2つの演算子もあります。それらはANSI標準の一部であり、MySQL固有のとは異なり、他のデータベースでサポートされています。NULLIS NULLIS NOT NULL<=>

あなたはそれらをMySQLの特化と考えることができます<=>

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

これに基づいて、特定のクエリ(フラグメント)をより移植性の高いものに変換できます。

WHERE p.name IS NULL

サポート

SQL:2003標準では、MySQLの<=>演算子と同じように機能するこの述語が次の形式で導入されました。

IS [NOT] DISTINCT FROM 

以下は普遍的にサポートされていますが、比較的複雑です:

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

2
違いがないということですか?これ<=>はやや役に立たない演算子ですか?正しい?
zzlalani 14

16
@zzlalaniまったくありません。<=>2つのオペランドを取りますが、IS (NOT) NULL1つだけを取ります。大きな違い... =それはその点でそれ自体と同じくらい有用です。
ジャック

12
@zzlalani IS NULLおよびIS NOT NULLSQL標準に含まれています。<=>MySQL固有の拡張機能です。
Daniel Dinnyes 14

5
だから、is not distinct from演算子のように。MySQLがその上でインデックスを使用できるかどうか知りたいと思っています...
Denis de Bernardy 2014

3
@Pacerierいいえ、の逆はa <=> bですNOT(a <=> b)
ジャック・

57

<=> NULL-safe equal to operator

この演算子は=演算子のように等価比較を実行しますが、両方のオペランドがNULLの場合はNULLではなく1を返し、一方のオペランドがNULLの場合はNULLではなく0を返します。

ドキュメントはこちら

サンプル :

IS NOT NULLを使用する必要があります。(比較演算子=と<>はどちらも、式のいずれかの側でUNKNOWNにNULLを指定します。)

SELECT * 
FROM table 
WHERE YourColumn IS NOT NULL;

null安全な等価演算子を無効にすることもできますが、これは標準SQLではありません。

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

1
修正:等号演算子<=>呼ばれるべきであり、安全でない等号演算子です。=NULL
Pacerier、2015

26

それはNULLセーフ等しい演算子

<=>演算子は、NULL値とフィールドを比較するために使用されます。通常=(等しい)の場合、比較値の1つがNULLの場合、演算子はNULLを返します。<=>演算子を使用すると、trueまたはfalseが返されます。<=>演算子はIS NULLと同じです。

マニュアルから:-

<=> =演算子のように等価比較を実行しますが、両方のオペランドがNULLの場合はNULLではなく1を返し、一方のオペランドがNULLの場合はNULLではなく0を返します。

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

編集: - 非常に遅く言及一つの重要な側面のメモを追加することが<=>しないとしても

余談:-

ない<=>

NULL値とフィールドを比較するために使用されるもう1つの点NOT <=>があります。通常の!=または<>(等しくない)の場合比較値の1つがNULLの場合、演算子はNULLを返します。<=>演算子にNOTを適用すると、trueまたはfalseが返されます。<=>演算子に適用されないは、IS NOT NULLと同じです。

例:-

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

1
NOT <=>は演算子ではないNOTため、の結果に適用されop1 <=> op2ます。
ジャック

@ジャック:-はい、あなたは正しいです。答えを更新しました!ポイントを作るためにそれを追加しました:)
Rahul Tripathi

だから私は<!=>演算子がないと思います
Kip

@kip:いいえ、ありません!
Rahul Tripathi 14

18

<=>MySQLのnullセーフの「等しい」演算子です。 マニュアルから

NULLセーフの等しい。この演算子は=演算子のように等価比較を実行しますが、両方のオペランドがNULLの場合はNULLではなく1を返し、一方のオペランドがNULLの場合はNULLではなく0を返します。

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

11

NULLセーフの等しい。この演算子は=演算子のように等価比較を実行しますが、両方のオペランドがNULLの場合はNULLではなく1を返し、一方のオペランドがNULLの場合はNULLではなく0を返します。

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

それの重要性:

NULL値を非NULL値と比較すると、NULLが返されます。値がnullかどうかを確認する場合。

等価演算子(<=>)は、NULLを通常の値と見なすため、両方の値がNULLの場合は1(NULLではない)を返し、値の1つがNULLの場合は0(NULLでない)を返します。

例えば

 SELECT NULL <=> NULL -- 1
 SELECT TRUE <=> TRUE -- 1
 SELECT col1 <=> col2 FROM myTable

10

<=>あるNULLセーフ等しい演算子はa <=> b書くことと同じです:

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

申し訳ありませんが、この演算子をの代わりに使用する理由が1つも見つかりませんでしたAND/OR IS (NOT) NULL。たとえば、あなたの例WHERE p.name <=> NULLはと同じWHERE p.name IS NULLです。


9

MySQLのドキュメントから:

NULLセーフの等しい。この演算子は=演算子のように等価比較を実行しますが、両方のオペランドがNULLの場合はNULLではなく1を返し、一方のオペランドがNULLの場合はNULLではなく0を返します。

<=>演算子の使用例は次のとおりです。

SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;

どちらが返されますか:

1, 1, 0

通常の=演算子の例は次のとおりです。

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

どちらが返されますか:

1, NULL, NULL

<=>オペレータは、非常によく似ている=以外、オペレータ<=>戻ることはありません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 |
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.